【问题标题】:Why asyncio.sleep doesn't work in python?为什么 asyncio.sleep 在 python 中不起作用?
【发布时间】:2021-07-01 09:49:35
【问题描述】:

这是我的代码:

logging.basicConfig(format='%(asctime)s %(name)s %(levelname)s %(message)s',
                    level=logging.INFO,
                    handlers=[
                        logging.FileHandler("bot.log"),
                        logging.StreamHandler()
                    ]
                    )
...

async def _create_order(order, delay=0):
    if delay:
        logging.info(f'sleep {delay}')
        start = timeit.default_timer()
        await asyncio.sleep(delay)
    logging.info(f'elapsed {timeit.default_timer() - start}')
    ...

并导致日志:

2021-04-05 17:20:18,274 root INFO sleep 0.01
2021-04-05 17:20:18,274 root INFO elapsed 0.0001959000000000266

延迟 = 0.1 时效果更好,但不如预期:

2021-04-05 17:25:50,849 root INFO sleep 0.1
2021-04-05 17:25:50,940 root INFO elapsed 0.09012620000000027

为什么 asyncio.sleep 不起作用?操作系统 Windows 10。Python 3.9

【问题讨论】:

标签: python logging python-asyncio sleep


【解决方案1】:

asyncio 的睡眠分辨率非常糟糕,尤其是在 Windows 上。在 Windows 上,分辨率约为 15 milliseconds。您的第一个睡眠持续时间低于睡眠分辨率,因此最终可能根本没有真正入睡。通过第二次测试,请求的睡眠时间与实际睡眠时间之间的差异仍然小于 15 毫秒。

【讨论】:

  • sleep(0) 是否仍将控制权返回给 Windows 上的事件循环?
  • @AleksandrGavrilov 是的,await asyncio.sleep(0) 被记录为始终让控制权交给事件循环。
【解决方案2】:

这显然是一个 known issue 在 Windows 上使用 asyncio,并且与 Windows 提供的用于获取内部时钟状态的系统调用的分辨率较差有关,大约 15 毫秒的错误。您可以通过运行测试这是否是您遇到的问题,

>>> import time; print(time.get_clock_info('monotonic'))

它返回时钟的分辨率。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2017-06-17
    • 2013-04-25
    • 2018-04-21
    • 2011-03-03
    相关资源
    最近更新 更多