| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 并发和并行以及线程安全 -> 正文阅读 |
|
[Java知识库]并发和并行以及线程安全 |
目录 ????????threading.Thread(target=func) ? ? ? ? *参数target指定线程执行的任务(函数) 注意:在做平台开发的时候,对象若不会再调用,可用"del"方法手动回收,节省内存空间. ? ? ? ? 线程之间是共用同一内存的,那么线程可以共享全局变量 ? ? ? ? 如何解决此类问题?控制线程,避免同时获取数据. threading模块中定义了Lock类,可以方便地处理锁定: ? ? ? ? #锁定:上锁原则---->哪里需要锁,锁就上哪里 并发并发:指的是任务数>CPU核数,通过操作系统的各种任务调度算法,实现多个任务"一起执行"(实际上总有些任务不在执行,因为CPU切换任务的速度非常快,看上去在一起执行而已).并发针对的是同一段时间内,有多个任务数在运行,强调同一段时间范围. 并行并行:指的是任务数≤CPU核数,即任务真的在一起执行.并行针对的同一时刻有多个任务数在运行,强调的是同一时刻. 并发与并行在CPU层面的表现: ?同步和异步同步:是指线程在访问某一资源时,获得了资源的返回结果之后才会执行其他操作(强调先做某件事,再做某件事). 异步:与同步相对,是指线程在访问某一资源时,无论是否取得返回结果,都进行下一步操作;当有了资源返回结果时,系统自会通知线程. ?threading模块实现多线程.python的threading模块是对thread模块做了一些包装的,可以更方便我们使用. 创建线程:????????threading.Thread(target=func)? ? ? ? *参数target指定线程执行的任务(函数)注意:在做平台开发的时候,对象若不会再调用,可用"del"方法手动回收,节省内存空间.追查threading.Thread()源代码,发现,我们穿进去的target参数,最终被赋值为self._target,并且在用完了后,调用了python内置方法del,回收了无用的self._target,回收了内存空间.? threading模块的Thread类提供一下方法: run( )? ? ? ? ????????用以表示线程活动的方法 start( )? ? ? ????????启动线程活动 join([time])? ? ? ? 设置主线程会等待time秒后再往下执行,time默认为子线程结束,多个子线程之间设置的值会叠加. isAlive( )? ? ? ? ? ?返回线程是活动线程 getName( )? ? ? ?返回线程名 setName( )? ? ? ?设置线程名 threading.currentThread(): 返回当前执行的线程. threading.enumerate(): 返回正在运行的所有线程(list) threading.activeCount(): 返回正在运行的线程数量 单线程执行func1和func2: ? ? ? ? 总计用时11秒多. ?多线程执行func1和func2: ? ? ? ? 总计用时:6秒多 ? ? ? ? 此处必须要join()方法让主线程等待所有子线程都运行结束,否则主线程运行结束了,子线程还在 ????????运行. ?线程安全---多线程共享全局变量:多线程之间修改全局变量 ? ? ? ? 线程之间是共用同一内存的,那么线程可以共享全局变量? ? ? ? 如:2个线程A,B同时对全局变量count递增,A在修改变量count时,刚获取到资源count,还没来得及修改count的值,CPU就被B线程剥夺,此时B读到的count值是A修改之前的值,假如B将count值从100增加到1000,此时CPU再次被A拿到,此时A继续执行之前未修改的count任务,获取到的count值仍是100,假如A将count值从A线程中的100增加到500,B又拿到CPU调度几乎,此时B读到的count数又变成了500,而非之前修改后的1000,此类问题即为多线程情况下的线程安全问题. ? ? ? ? 如何解决此类问题?控制线程,避免同时获取数据.? ? ? ? ? ? ? ? 同步&互斥锁.? ? ? ? 同步:同步就是协同步调,按照预定的先后顺序进行运行."同"字从字面上容易理解为一起动作,其实不是,"同"字应指协同/协助/互相配合,如进程,线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B执行,再将结果给A,A再继续执行. ? ? ? ? 互斥锁:线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁. ? ? ? ? ? ? ? 互斥锁为资源引入的一个状态:锁定/非锁定. ? ? ? ? ? ? ? 某个线程要更改共享数据时,先将其锁定,此时自愿的状态为"锁定",其他线程不能更 ??????????????改直到该线程释放资源,将资源的状态改为"非锁定",其他线程才能再次锁定该资源. ? ? ? ? ? ? ? ?互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性. threading模块中定义了Lock类,可以方便地处理锁定:? ? ? ? #创建锁:mutex=threading.Lock()? ? ? ? #锁定:上锁原则---->哪里需要锁,锁就上哪里mutex.acquire()? ? ? ? #释放:mutex.release()注意:如果这个锁之前是没有上锁的,那么acquire不会堵塞. 线程安全问题示例: ?解决方案示例:加锁 GIL全局解释器锁: ? ? ? ? IO密集型:涉及到网络收发,磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗少,任务的大部分时间都在等IO操作完成(IO速度远小于CPU和内存的速度)。 ? ? ? ? CPU密集型:即计算密集型,任务的特点是要进行大量的计算,消耗CPU资源,比如计算数据,对视频进行高清解码等,全靠CPU的运算能力。 ? ? ? ? GIL锁:即全局解释器锁,每个线程在执行前都要先获得GIL锁才能执行,保证了同一时刻只有1个线程可以执行代码,只能在1个CPU中执行,也就造成无法使用多核CPU的硬件优势;GIL锁锁Cpython解释器造成的,也只存在于cpython类型的解释器中,q其他类型的解释器如Jpython解释器无GIL锁的问题,所以 GIL锁跟python语言本身无任何关系。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:20:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |