Python-asyncio

1.基于生成式构造带状态的函数

一个函数多次调用都从上次返回的地方重新开始,相当于给一个机会从函数执行的中间切出去,再切回来的时候从原来的地方重新开始,这样能避免那种需要在函数执行过程中保留过多上下文信息的问题。对于异步io,如果我们能保留函数上下文,在等待异步io返回的时候切出去,这样就不需要费力写回调链了,一切就像同步调用一样,await一下,返回之后继续。唯一的问题在于,异步io本身是有传染性的,为了最大程度利用io等待的时间,我们实际希望协程在异步io切出去之后,程序能继续调度其它task

2.sleep函数实现

@types.coroutine
def __sleep0():
    """Skip one event loop run cycle.

    This is a private helper for 'asyncio.sleep()', used
    when the 'delay' is set to 0.  It uses a bare 'yield'
    expression (which Task.__step knows how to handle)
    instead of creating a Future object.
    """
    yield


async def sleep(delay, result=None, *, loop=None):
    """Coroutine that completes after a given time (in seconds)."""
    if delay <= 0:
        await __sleep0()
        return result

    if loop is None:
        loop = events.get_event_loop()
    future = loop.create_future()
    h = loop.call_later(delay,
                        futures._set_result_unless_cancelled,
                        future, result)
    try:
        return await future
    finally:
        h.cancel()

这个地方是个很好的例子,用Future类封装事件等待,避免关心套接字相关的细节,但也意味着,我们如果希望将原有的io操作变成异步型的话,要么封装自己的协程,像sleep这样,将程序变成loop.run_until_complete,要么就是程序库自己提供了兼容asyncio的接口。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 大纲 操作系统任务调度 进程、线程 协程 Asyncio4.1 定义一个协程(Coroutine)4.2 定义一个...
    5LuK6Z2e5pio阅读 3,136评论 0 4
  • 作者:Li_Mr 原文:开源中国博客 ​时至2018年的今天,C++ 在互联网服务端开发方向依然占据着相当大的份额...
    OSC开源社区阅读 22,925评论 2 31
  • 亲爱的Wendy: 今天妈妈很忙,没时间送你上放学,今天你作业是自己一个人在妈妈办公室独立完成的。妈妈开完会回来后...
    C呀么CJ阅读 142评论 0 1
  • Amazon 云具有一年的free trail使用时间,可以免费使用ec2,redis等一系列产品,这是云界很不错...
    冀希阅读 314评论 0 1
  • 2018年1月18日(补) 星期四 阴 忍了一周的怒火今天还是没忍住,对着哥哥大发雷霆。 今...
    家有茟霖阅读 239评论 0 0

友情链接更多精彩内容