专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
阿里云云栖号  ·  国通星驿与阿里云共同启动AI战略合作! ·  10 小时前  
程序员的那些事  ·  外网热议:为什么 DeepSeek ... ·  3 天前  
OSC开源社区  ·  AI做的音乐,真心不差 ·  2 天前  
程序猿  ·  微软重磅开源 Copilot!64 岁 ... ·  2 天前  
伯乐在线  ·  吵翻了!苹果“液态玻璃”被指像 17 ... ·  2 天前  
伯乐在线  ·  吵翻了!苹果“液态玻璃”被指像 17 ... ·  2 天前  
51好读  ›  专栏  ›  OSC开源社区

Python 中的异步编程:Asyncio

OSC开源社区  · 公众号  · 程序员  · 2017-05-09 08:20

正文

请到「今天看啥」查看全文


except StopIteration as exc:

self.set_result(exc.value)

except BaseException as exc:

self.set_exception(exc)

raise

else:

...

self._loop.call_soon(self._step)


事件循环 — 把它想成 asyncio 的中心执行器


现在我们看一下所有这些如何融为一体。正如我之前提到的,异步代码在一个线程中运行。



从上图可知:

1.消息循环是在线程中执行

2.从队列中取得任务

3.每个任务在协程中执行下一步动作

4.如果在一个协程中调用另一个协程(await ),会触发上下文切换,挂起当前协程,并保存现场环境(变量,状态),然后载入被调用协程

5.如果协程的执行到阻塞部分(阻塞I/O,Sleep),当前协程会挂起,并将控制权返回到线程的消息循环中,然后消息循环继续从队列中执行下一个任务...以此类推

6.队列中的所有任务执行完毕后,消息循环返回第一个任务



异步和同步的代码对比


现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep 方法外,其余部分完全相同。在第一个脚本里,我会用标准的 time.sleep 方法,在第二个脚本里使用 asyncio.sleep 的异步方法。


这里使用 Sleep 是因为它是一个用来展示异步方法如何操作 I/O 的最简单办法。


使用同步 sleep 方法的代码:

import asyncio

import time

from datetime import datetime



async def custom_sleep():

print('SLEEP', datetime.now())

time.sleep(1)


async def factorial(name, number):

f = 1

for i in range(2, number+1):

print('Task {}: Compute factorial({})'.format(name, i))

await custom_sleep()







请到「今天看啥」查看全文