首页 > 编程语言 > 详细

python第九天(9-34)

时间:2019-02-05 11:10:28      阅读:193      评论:0      收藏:0      [点我收藏+]

技术分享图片

一:并行,并发概念

  • 并发:指系统具有操作多个任务的能力
  • 并行:指形同具有同时操作多个任务的能力
  • 并行可以看作是并发的子集

二:同步,异步概念

  • 同步:所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或不继续执行后续操作-------就是等
  • 个人理解:当程序出现阻塞++++++++++++    的时候,一直等到阻塞结束
  • 异步:当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作
    • 个人理解:当程序处于阻塞的时候,就去执行其他的操作,等到阻塞结束,再回来

技术分享图片

一:GIL

  • 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念
  • 即全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行

二:任务分类

  • IO密集型任务:python的多线程是有意义的
  • 计算密集型任务:不适合python

 GIL一篇文章:https://blog.csdn.net/weixin_41594007/article/details/79485847

 

技术分享图片

一:同步锁

  通常被用来实现对共享资源的同步访问,为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire()方法来获取锁对象(如果其他线程已经获得了该锁,则当前线程需要等待其被释放),待资源访问完后,在调用release方式释放锁

二:代码实例解析

技术分享图片
 1 def minus():
 2     global num
 3     temp=num
 4     #time.sleep(0.005)
 5     num=temp-1
 6 
 7 if __name__=="__main__":
 8     import threading,time
 9     num=100
10     thread=[]
11     for i in range(100):
12         i=threading.Thread(target=minus)
13         thread.append(i)
14         i.start()
15     for t in thread:#让主线程等待子线程完毕再执行
16         t.join()
17     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,但当第二次切换线程时,有可能去到第一个线程去执行第二部,这样就会出现这种情况

以上为个人理解

 

python第九天(9-34)

原文:https://www.cnblogs.com/Mr-l/p/10352545.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!