gpt4 book ai didi

python - 异步 : how to combine sync code without forcing full exposure to asyncio

转载 作者:行者123 更新时间:2023-12-03 23:52:46 26 4
gpt4 key购买 nike

似乎 python 的 asyncio 是一种全有或全无的交易。具体来说,它似乎强制完整的调用堆栈是异步感知的。

下面是一个例子:

让我们假设有一个由函数 a() 实现的算法。
该算法调用函数 b()。

def a(b):
for i in ...:
# do smth...
res = b()
# do smth more ...

现在让我们假设函数 b() 在不同的环境中可能以不同的方式实现,并且人们可能想要在异步事件循环(使用 loop.call_soon())中调用 a() 和 b() 调用一些异步感知代码:
def b():
await .... # this forces b() to be declared async.

似乎明确禁止使用现有的事件循环......
那么,是否有方法可以在不强制将完整堆栈(a() 和 b())显式定义为异步协程的情况下实现此功能?

最佳答案

尽管从表面上看 asyncio 是一个全有或全无的交易,但仍有两个逃生舱口可以在处理遗留或异构环境时提供帮助:

  • 在 asyncio 中,您可以等待 loop.run_in_executor(callable, args...) 评估另一个线程中的同步代码,暂停当前协程直到结果准备好。
  • 在 asyncio 之外,您可以使用 asyncio.run_coroutine_threadsafe() 将协程提交给在另一个线程中运行的事件循环。它立即返回返回 concurrent.futures future其中有一个阻塞 result()阻止当前线程而不会对事件循环产生不利影响的方法。 (使用 run_coroutine_threadsafe 需要事先在专用线程中启动事件循环。)

  • 有了这两个工具供您使用,混合 asyncio 和经典同步代码并不难。

    关于python - 异步 : how to combine sync code without forcing full exposure to asyncio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55070498/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com