并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。 并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时 执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序 对于时间片资源的争夺。
在多线程中利用互斥锁解决资源竞争 多线程共享全局变量
进程线程区别(把进程理解为流水线 线程就是流水线上的工人) 进程是资源分配的单位 线程是操作系统调度的单位 线程不能独立运行 需依附在进程中 线程资源开销小 但不利于资源的管理和保护 ,进程则相反
进程 线程 协程对比 通俗描述: 制造商品 为制造商品准备的生产线资源叫:进程 在生产线找工人生产 叫做:线程 为了提高生产率 三种方法: 1,在一条生产线多招工人 即是单进程 多线程 2,增加生产线 增加工人 即是多进程 多线程 3,为提高效率 一个线程 在等待某种条件 可以充分利用这个时间去做其他事情,这既是协程 总结:
进程是资源分配的单位 线程是操作系统调度的单位 进程切换需要的资源最大 效率很低 线程切换需要的资源一般 效率一般 协程切换任务资源很小效率高 多进程 多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
GIL 全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻 只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的 同时执行。
如何解决GIL锁的问题呢? 1.更换cpython为jpython(不建议) 2.使用多进程完成多线程的任务 3.在使用多线程可以使用c语言去实现
什么时候会释放Gil锁, 遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil 会有一个专门ticks进行计数 一旦ticks数值达到100 这个时候释放Gil锁 线程之间开始竞争Gil锁(说明: ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)
互斥锁和Gil锁的关系 Gil锁 : 保证同一时刻只有一个线程能使用到cpu 互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱
import time import threading #定义一个全局变量 g_num = 100
def test1(): global g_num #上锁,如果之前没有被上锁,那么此时上锁成功 #如果上锁之前已经上锁 那么此时会堵塞在这里 直到这个锁被解开 mutex.acquire() for i in range(num): g_num += 1 #解锁 mutex.release() print("—in test1 g_num=%d—" % g_num)
def test2(): global g_num mutex.acquire() for i in range(num): g_num += 1 #解锁 mutex.release() print("—in test2 g_num=%d—" % g_num)
#创建互斥锁 mutex = threading.Lock()
def main(): t1 = threading.Thread(target=test1,args=(1000000,)) t2 = threading.Thread(target=test2,args=(1000000,)) t1.start() time.sleep(1)
t2.start() time.sleep(1) print("—in main Thread g_num = %d—" %g_num)
if name == “main”: main()