关于python:yyds干货盘点python协程

42次阅读

共计 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 技术大本营,获取更多技能与教程。

正文完
 0