Python的协程来源于yield指令。yield有两个功能:yielditem用于产生一个值,该值被反馈给next()的调用者。做出让步,暂停执行生成器,让调用者继续工作,直到它需要使用另一个值并调用next()。importasyncioasyncdefcompute(x,y):print("Compute%s+%s..."%(x,y))awaitasyncio.sleep(x+y)returnx+yasyncdefprint_sum(x,y):result=awaitcompute(x,y)print("%s+%s=%s"%(x,y,result))循环=asyncio.get_event_loop()tasks=[print_sum(1,2),print_sum(3,4)]loop.run_until_complete(asyncio.wait(tasks))loop.close()协程是线程的调度,yield可以看做作为类似于懒惰评估的过程控制工具来实现协同多任务处理。Python3.5正式引入了async/await表达式,使得coroutines得到了官方的支持和语言层面的优化,大大简化了之前yield的写法。线程被内核抢占式调度,保证了每个线程都有执行的机会。协程运行在同一个线程中,由语言运行时的EventLoop(事件循环)调度。和大多数语言一样,在Python中,协程的调度是非抢占式的,也就是说一个协程必须主动放弃执行机会,其他协程才有机会运行。产生执行的关键字是等待。也就是说,如果一个协程被阻塞了,不让出CPU,那么整个线程就会卡住,没有任何并发??。简而言之,任何时候都只有一个协程在运行。PS:作为服务端,事件循环的核心是IO多路复用技术。所有来自客户端的请求都经过IO多路复用功能处理;作为客户端,事件循环的核心是使用Future对象来延迟执行。并使用send函数激活协程,挂起,等待服务端处理完成后再调用CallBack函数继续后面的流程。以上就是本次分享的全部内容。现在欢迎想要学习编程的朋友们关注Python技术大本营,获取更多技能和教程。
