# 协程的概念:单个线程内遇到IO进行切换,提高CPU利用率 # 协程的任务切换核心模块--greenlet # import greenlet # def func1(): # print('func1 start...') # g2.switch() # 切换到g2执行 # print('func1 end...') # g2.switch() # 切换到g2执行 # # def func2(): # print('func2 start...') # g1.switch() # 切换到g1执行 # print('func2 end...') # # g1 = greenlet.greenlet(func1) # g2 = greenlet.greenlet(func2) # g1.switch() # 切换到g1执行 ''' 输出结果:两个任务交替执行 func1 start... func2 start... func1 end... func2 end... ''' # 协程模块 # from gevent import monkey;monkey.patch_all() # 让协程识别IO,要在需识别IO的模块之前导入并执行 # import gevent # import time # # def func1(): # print('func1 start...') # # 模拟任务1耗时 # time.sleep(2) # print('func1 end...') # # def func2(): # print('func2 start...') # # 模拟任务2耗时 # time.sleep(2) # print('func2 enc...') # # 同步执行耗时 # t1 = time.time() # func1() # func2() # te1 = time.time() - t1 # # 协程执行耗时 # t2 = time.time() # g1 = gevent.spawn(func1) # g2 = gevent.spawn(func2) # gevent.joinall([g1,g2]) # 等待所有协程执行结束 # te2 = time.time() - t2 # print(te1,te2) ''' 输出结果: func1 start... func1 end... func2 start... func2 enc... func1 start... func2 start... func1 end... func2 enc... 4.006799221038818 2.000690221786499 ''' # 协程获取返回值与传参 # from gevent import monkey;monkey.patch_all() # import gevent # import time # def func1(): # n = 10 # time.sleep(2) # return n*n # def func2(n): # time.sleep(2) # return n+n # def func3(arg1,arg2,arg3): # return arg1+arg2+arg3 # g1 = gevent.spawn(func1) # 完全异步提交任务 # g1.join() # 需要等待协程执行结束才有返回值 # print(g1.value) # 100 # 协程传参 # g2 = gevent.spawn(func2,100) # g2.join() # print(g2.value) # 多个参数 # g3 = gevent.spawn(func3,1,2,3) # g3.join() # print(g3.value) ''' 协程切换是遇到IO切换,使用于高IO场景,例如爬虫任务 '''
Python之协程
最新推荐文章于 2023-08-07 15:44:47 发布