在 python asyncio 中运行长同步任务的正确方法

问题描述 投票:0回答:1

我有一个异步传递消息的设置,但我也有一些繁重的工作负载运行任务(长达几分钟)。我无法理解应该如何使用 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())
python asynchronous python-asyncio
1个回答
0
投票

一般来说,您不应该在异步事件循环线程中执行长时间运行的任务,其原因正是您所描述的:它在持续时间内占用线程,或者至少直到任务

await
发生某个事件为止。您通常希望在单独的线程中运行此类工作。

run_coroutine_threadsafe()loop.call_soon_threadsafe() 都可以帮助您做到这一点,具体取决于您是想使用 Future 还是回调来了解繁重任务的完成情况和结果。

话虽如此,从您对程序的描述中并不清楚消息传递实际上应该如何工作,也不清楚使用 asyncio 来达到您的目的有何意义。您应该考虑它可能不适合您的工作。

© www.soinside.com 2019 - 2024. All rights reserved.