目录
注意:在做平台开发的时候,对象若不会再调用,可用"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( ) 用以表示线程活动的方法,run方法是执行到这个子线程时,自动调用的方法
start( ) 启动线程活动,start方法是声明分到一个子线程的函数已经就绪,等待被CPU执行
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语言本身无任何关系。