初始协程概念
# pip 装模块 greenlet和gevent # 协程 # 与进程、线程一样也是实现并发的手段 # 创建一个线程、关闭一个线程都需要创建寄存器、栈等、需要消耗时间 # 协程本质上是一个线程 # 能够在多个任务之间切换来节省一些IO时间 # 协程中任务之间的切换时间开销,要远远小于进程或线程之间的切换 # 4CPU中,进程一般创建4+1个进程 + 一个进程中线程为4*5 + 一个线程中创建500个协程,一般这是一台4CPU的机器电脑上能达到好的效率的并发程度,50000个并发。nginx这种负载均衡的东西就是这种思路 # # def cosumer(): # ''' # 生成器函数: # :return: # ''' # while 1: # x = yield # print('处理消费了数据', x) # # # if __name__ == '__main__': # c = cosumer() # 得到生成器 # next(c) # 走到生成器函数中的第一个yield # c.send(2) # 将2给了生成器函数中的x并执行print然后又到了yield那 # # 在一个函数中控制另外一个函数,让这两个函数来回切换执行,下面用的是生成器实现的。协程效果 # def cosumer(): # ''' # 生成器函数: # :return: # ''' # while 1: # x = yield # print('处理消费了数据', x) # # def producer(): # c = cosumer() # next(c) # for i in range(10): # print('生产了数据', i) # c.send(i) # # if __name__ == '__main__': # producer() # 真正的协程实现任务之间的切换. # 真正的协程模块就是使用greenlet完成的任务之间的切换。省去了IO时间,当一个任务发生IO时,肯定会阻塞,此时这个时候去切换任务让另一个任务工作,另一个任务工作切换回来时,这个任务的IO时间正好结束,这就是协程想达到的效果,节省IO的切换时间 import time from greenlet import greenlet def eat(): print('eating start') g2.switch() # 切换到play中执行 print('eating end') def play(): print('playing start') g1.switch() #切换到eat中执行 g1 = greenlet(eat) # eat任务放到greenlet中 g2 = greenlet(play) # play任务放到greenlet中 g1.switch() # 切换到eat任务执行到g2.switch() # 打印信息为 # eating start # playing start # eating end # Process finished with exit code 0