共计 923 个字符,预计需要花费 3 分钟才能阅读完成。
Python 的协程源于 yield 指令。yield 有两个性能:
yield item 用于产出一个值,反馈给 next() 的调用方。
作出退让,暂停执行生成器,让调用方持续工作,直到须要应用另一个值时再调用 next()。
import asyncio
async def compute(x, y):
print("Compute %s + %s ..." % (x, y))
await asyncio.sleep(x + y)
return x + y
async def print_sum(x, y):
result = await compute(x, y)
print("%s + %s = %s" % (x, y, result))
loop = 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 表达式,使得协程正式在语言层面失去反对和优化,大大简化之前的 yield 写法。
线程是内核进行抢占式的调度的,这样就确保了每个线程都有执行的机会。
而 coroutine 运行在同一个线程中,由语言的运行时中的 EventLoop(事件循环)来进行调度。
和大多数语言一样,在 Python 中,协程的调度是非抢占式的,也就是说一个协程必须被动让出执行机会,其余协程才有机会运行。
让出执行的关键字就是 await。也就是说一个协程如果阻塞了,继续不让出 CPU,那么整个线程就卡住了,没有任何并发。
简而言之,任何时候只有一个协程正在运行。
PS: 作为服务端,event loop 最外围的就是 IO 多路复用技术,所有来自客户端的申请都由 IO 多路复用函数来解决; 作为客户端,event loop 的外围在于利用 Future 对象提早执行,并应用 send 函数激发协程, 挂起, 期待服务端解决实现返回后再调用 CallBack 函数持续上面的流程
以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注 Python 技术大本营,获取更多技能与教程。
正文完