1、协程和线程的区别是什么?
协程 ,又称为微线程,它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程。在实现多任务时, 线程切换从系统层面远不止保存和恢复CPU上下文这么简单。操作系统为了程序运行的高效性,每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作,所以线程的切换非常耗性能。但是协程的切换只是单纯地操作CPU的上下文一般在应用程序中,IO的消耗比较大时可以考虑使用协程来处理多任务。还有一个不同点就是线程是操作系统拥有的、而协程却是开发者通过特定手段来实现的。 1# 第三方扩展库、实现协程 2 3import gevent 4 5def unit(name): 6 7 for i in range(3): 8 9 print('当前协程: ', name) 10 11 print('业务循环: ',i) 12 13 # 这里的耗时操作需要使用gevent提供的sleep()函数 14 15 gevent.sleep(1) 16 17if __name__ == "__main__": 18 19 # 创建三个协程 20 21 ge1 = gevent.spawn(unit, '协程1') 22 23 ge2 = gevent.spawn(unit, '协程2') 24 25 ge3 = gevent.spawn(unit, '协程3') 26 27 # 等待协程 28 29 ge1.join() 30 31 ge2.join() 32 33 ge3.join()
1# 分析:在加上协程的sleep()函数等待后,可以发现每执行到一个循环的等待时间时就不会立即进行下一个循环打印。 2# 而是下一个协程进来执行,因此就会下面的输出结果。 3# 当前协程: 协程1 4# 业务循环: 0 5# 当前协程: 协程2 6# 业务循环: 0 7# 当前协程: 协程3 8# 业务循环: 0 9# 当前协程: 协程1 10# 业务循环: 1 11# 当前协程: 协程2 12# 业务循环: 1 13# 当前协程: 协程3 14# 业务循环: 1 15# 当前协程: 协程1 16# 业务循环: 2 17# 当前协程: 协程2 18# 业务循环: 2 19# 当前协程: 协程3 20# 业务循环: 2 21 22# 分析:如果取消协程等待,则打印出的结果应该是下面,只有同一个协程结果执行完毕后再执行下一个协程。 23# 当前协程: 协程1 24# 业务循环: 0 25# 当前协程: 协程1 26# 业务循环: 1 27# 当前协程: 协程1 28# 业务循环: 2 29# 当前协程: 协程2 30# 业务循环: 0 31# 当前协程: 协程2 32# 业务循环: 1 33# 当前协程: 协程2 34# 业务循环: 2 35# 当前协程: 协程3 36# 业务循环: 0 37# 当前协程: 协程3 38# 业务循环: 1 39# 当前协程: 协程3 40# 业务循环: 2
|