如何让python等待“无”,首先运行事件循环

Posted

技术标签:

【中文标题】如何让python等待“无”,首先运行事件循环【英文标题】:How to make python await for "nothing", running the event loop first 【发布时间】:2019-08-04 19:17:49 【问题描述】:

我运行一个由网络事件运行的 python 程序,并且不能在不处理心跳的情况下运行 10-15 秒。 (更具体地说,我使用 discord.py 处理大量事件)

在一种可能的情况下,我可以让命令将大量数据存储到数据库中,这可能会占用超过 10 到 15 秒的时间,并且会阻塞。

这些是数以千计的小型数据库调用,如果需要,我可以在这些调用之间使异步事件循环“运行”。在这种情况下,我怎样才能让 python "await for nothing"?

类似的 hack 是在 javascript 中等待已解析的 Promise,这会将进程返回事件循环,首先解决更紧迫的事件。

【问题讨论】:

【参考方案1】:

await asyncio.sleep(0) - is a way 将控制权返回给事件循环。

尽管您可以采用另一种方式,而不是不断地调用它:使用run_in_executor 运行您的阻塞代码in another thread 并等待它完成。这样,事件循环通常会在阻塞后台线程中正在处理的内容时继续其进程。

【讨论】:

以上是关于如何让python等待“无”,首先运行事件循环的主要内容,如果未能解决你的问题,请参考以下文章

一文搞懂Node.js以及浏览器中的事件循环机制

如何让函数等待事件发生?

QEventLoop 仅等待本地事件而不是主循环事件

asyncio:等待来自其他线程的事件

使用 asyncio 时,如何让所有正在运行的任务在关闭事件循环之前完成

RuntimeError:事件循环已关闭任务被破坏但它正在等待 Discord Python