我有一个异步传递消息的设置,但我也有一些繁重的工作负载运行任务(长达几分钟)。我无法理解应该如何使用 asyncio 来做到这一点。例如,我想要实现的目标:
目前,我正在异步循环中进行大量计算,但这会阻塞通信。
如何开始繁重的同步计算?一些代码:
def heavy(i: num) -> num:
result = ...
return result
async def main():
while True:
req = await getInput()
result = ??? heavy(req.num)
await sendResult()
if __name__ == '__main__':
asyncio.run(main())
一般来说,您不应该在异步事件循环线程中执行长时间运行的任务,其原因正是您所描述的:它在持续时间内占用线程,或者至少直到任务
await
发生某个事件为止。您通常希望在单独的线程中运行此类工作。
run_coroutine_threadsafe() 或 loop.call_soon_threadsafe() 都可以帮助您做到这一点,具体取决于您是想使用 Future 还是回调来了解繁重任务的完成情况和结果。
话虽如此,从您对程序的描述中并不清楚消息传递实际上应该如何工作,也不清楚使用 asyncio 来达到您的目的有何意义。您应该考虑它可能不适合您的工作。