【问题标题】:How do I run two functions at once using Asyncio in Python?如何在 Python 中使用 Asyncio 一次运行两个函数?
【发布时间】:2021-10-27 22:08:51
【问题描述】:
queue = []

async def funcA():
    r = random.randint(0, 1000)
    i = 0
    for i in range(10000000):
        pass
    print(r)
    queue.append(r)

    asyncio.create_task(funcb(r))

async def funcb(r):
    i = 0
    for i in range(100000000):
        pass
    print(r, "XX")
    queue.pop()


async def main():
    for i in range(10):
        await funcA()
    print(queue)


if __name__ == "__main__":
    asyncio.run(main())

如何让funcb() 同时运行?在此代码中,funcb() 仅在 funcA() 的所有调用都执行完毕后运行。我希望 funcB() 与 funcA() (在相同或不同的线程上)同时运行。这里如果funcA() 无限运行,那么funcB() 将永远不会运行。

【问题讨论】:

  • 它们都是阻塞函数,它们不会在内部产生/等待任何东西。即使你一起启动它们,它们也只能一个接一个地执行。对于并行执行,您需要线程。
  • 您也许可以使用run_in_executor,但正如其他人所说,这不是您真正想用 asyncio 做的事情
  • 如果您发现我的回答有帮助,我们不介意收到您的回复并打勾。

标签: python python-3.x asynchronous async-await python-asyncio


【解决方案1】:

Asyncio 是所谓的non-preemptive 任务调度器。

这意味着,它不能自行在任务之间来回切换,它需要它正在调用的函数主动放弃(=yield)优先级。

由于您的函数不是异步的(= 中没有任何命令可以等待带有 await 关键字的内容),因此它会在返回到 asyncio 调度程序之前运行到完成。

您描述问题的方式听起来并不适合异步编程,而是需要多线程甚至多处理(如果您希望从“同时”计算中获得加速)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多