标签:url 产生 解释 print range lock 多线程 mic osc
一:并行,并发概念
二:同步,异步概念
一:GIL
二:任务分类
GIL一篇文章:https://blog.csdn.net/weixin_41594007/article/details/79485847
一:同步锁
通常被用来实现对共享资源的同步访问,为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire()方法来获取锁对象(如果其他线程已经获得了该锁,则当前线程需要等待其被释放),待资源访问完后,在调用release方式释放锁
二:代码实例解析
1 def minus(): 2 lock.acquire()#对资源进行枷锁 3 global num 4 temp=num 5 time.sleep(0.0001) 6 num=temp-1 7 lock.release()#对资源释放锁 8 if __name__=="__main__": 9 import threading, time 10 num=100 11 thread=[] 12 lock = threading.Lock() 13 for i in range(100): 14 i=threading.Thread(target=minus) 15 thread.append(i) 16 i.start() 17 for t in thread:#让主线程等待子线程完毕再执行 18 t.join() 19 print(num)
不加同步锁的解析 1.再没有time.sleep的时候程序结果为0 2.但在加入time.sleep时会发现随时间的不一样,答案也不一样 time.sleep(1):99 3.时间一样,但每次结果也不一样 time.sleep(0.001):88 84 89..... 4.猜想:当遇到sleep时,cpu就会切换线程去执行,当sleep时间刚好切换过100此线程之后,又开始执行这100个线程的最后一步,导致结果为100 当遇到sleep不够切换100次线程时,第一个线程先开始temp=100,遇到sleep切换到第二个线程,第二个线程temp也为100,但当第二次切换线程时,有可能去到第一个线程去执行第二部, 这样就会出现这种情况 以上为个人理解 ----------------------------------------------------------------------------------------------------
三:同步锁理解:对于加锁部分,不会出现线程的切换,从而产生的效果是加锁部分是串行执行的
标签:url 产生 解释 print range lock 多线程 mic osc
原文地址:https://www.cnblogs.com/Mr-l/p/10352545.html