Python中的asyncio.sleep()是如何实现的?

13

我是一名新手Python3爱好者,希望了解asyncio.sleep()在库中如何实现。

我能编写协程,但似乎无法想出如何开始编写异步睡眠的代码。

如果您直接分享代码或快速教学如何在我的本地机器上查找代码,那将非常棒。谢谢!


你的目标是找到asyncio.sleep的实际生产代码,还是想了解如何自己编写一个?前者涉及到许多库所涵盖的问题(例如取消、对sleep(0)的特殊处理、提供结果值的选项等),比人们预期的要复杂得多。 - user4815162342
1个回答

17

如果你使用的是Python实现的代码(而不是C扩展),并且正在使用 ipython,那么查看源代码的一种简单方法是使用 ?? 运算符。例如,在我的3.6版本中:

In [1]: import asyncio

In [2]: asyncio.sleep??
Signature: asyncio.sleep(delay, result=None, *, loop=None)
Source:
@coroutine
def sleep(delay, result=None, *, loop=None):
    """Coroutine that completes after a given time (in seconds)."""
    if delay == 0:
        yield
        return result

    if loop is None:
        loop = events.get_event_loop()
    future = loop.create_future()
    h = future._loop.call_later(delay,
                                futures._set_result_unless_cancelled,
                                future, result)
    try:
        return (yield from future)
    finally:
        h.cancel()
File:      c:\program files\python36\lib\asyncio\tasks.py
Type:      function

您还可以直接查看CPython GitHub repo,但根据代码组织,可能不容易找到(例如,在这种情况下,代码实际上存在于asyncio.tasks中,并自动导入到asyncio中),而ipython魔术函数则可以直接为您找到它。


我没有想到可以使用之前尝试过的call_later函数。非常感谢,谢谢! - laycat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接