协程(微线程)
协程:
1. 协程:单线程下的开发,又称为微线程 # 注意:线程和进程的操作是由程序出发系统接口,最后的执行者是系统,协程的执行操作则由程序员决定 # 1.1 简单实现协程 # import time # def task1(): # while True: # yield 's' # time.sleep(1) # def task2(): # while True: # yield 'y' # time.sleep(1) # if __name__ == '__main__': # t1 = task1() # print(t1)# t2 = task2()# while True:# print(next(t2))# print(next(t1)) # 1.2 应用场景 # 1.如果一个线程里面由IO操作比较多时,可以用协程 # IO操作 import/output # 常见的IO操作:文件操作、网络请求 # 2.适合高并发处理
greenlet:
# greenlet:由C语言编写的实现协程模块,通过设置switch()来实现任意函数之间的切换 # 注意:greenlet属于手动切换,当遇到IO操作,程序会阻塞,而不能进行自动切换 # 通过green实现任务的切换 # 导入greenlet模块 from greenlet import greenlet def sing():print('sing..')t2.switch() #切换到t2中运行print('sing finally') def dance():print('dance')print('dance finally')t1.switch() # sing() # dance() if __name__ == '__main__':# 创建写成对象 greenlet(任务名)t1 = greenlet(sing)t2 = greenlet(dance)# t1.switch() #切换到t1中运行t2.switch()
gevent:
# gevent:遇到IO操作时,会进行自动切换,属于主动式切换 # 导入模块 import gevent import time # 使用: # gevent.spawn(函数名):创建协程对象 # gevent.sleep(): 耗时操作 # gevent.join(): 阻塞,等待某个协程执行结束 # gevent.joinall(): 等待所有写成对象都执行结束再退出,参数是一个协程对象列表 # def sing(): # print('sing..') # gevent.sleep(2) # print('sing finally') # def dance(): # print('dance') # gevent.sleep(3) # print('dance finally') # if __name__ == '__main__': # g1 = gevent.spawn(sing) # g2 = gevent.spawn(dance) # # 2.阻塞 # g1.join() #等待g1执行结束 # g2.join() # joinall # def sing(name): # for i in range(3): # gevent.sleep(1) # print(f'{name} is singing,第{i}次') # if __name__ == '__main__': # gevent.joinall([ # gevent.spawn(sing,'suyikai'), # gevent.spawn(sing,'xuchongwen') # ]) # joinall():等待所有协程都执行结束在退出# monkey补丁:拥有在模块进行时替换的功能 # 导入模块 # from gevent import monkey # monkey.patch_all() #将用到的time.sleep()天换成gevent里面自己实现耗时操作的gevent.sleep()方法 # # 注意:要放在补丁代码前面 # def sing(name): # for i in range(3): # time.sleep(1) # print(f'{name} is singing,第{i}次') # if __name__ == '__main__': # gevent.joinall([ # gevent.spawn(sing,'suyikai'), # gevent.spawn(sing,'xuchongwen') # ])# 总结: # 1.线程是CPU调度的基本单位,线程是资源分配的基本单位,协程是单线程下的开发 # 2.进程、线程、协程的对比 # 进程:切换需要的资源最大,效率最低 # 线程:切换需要的资源一般,效率一般 # 协程:切换需要的资源最小,效率高 # 3.多线程适合IO密集型操作(文件操作、爬虫),多进程适合CPU密集型操作(科学计算、视频解码) # 4.进程、线程、协程都是可以完成多任务的,可以根据自己实际开发的需要选择使用。