似乎python的asyncio是一种全有或全无的交易。特别是它似乎强制完全调用堆栈是异步感知。
这是一个例子:
假设有一个由函数a()实现的算法。 该算法调用函数b()。
def a(b):
for i in ...:
# do smth...
res = b()
# do smth more ...
现在让我们假设函数b()可能在不同的环境中以不同的方式实现,并且可能想要在异步事件循环(使用loop.call_soon())中调用a(),并使用b()调用一些asyncio感知代码:
def b():
await .... # this forces b() to be declared async.
使用现有的事件循环似乎是明确禁止的...那么,是否有方法来实现此功能而不强制将完整堆栈(a()和b())显式定义为async协同程序?
尽管从表面上看,asyncio是一种全有或全无的交易,但在处理遗留或异构环境时,仍有两个逃脱舱口可以帮助:
loop.run_in_executor(callable, args...)
评估另一个线程中的同步代码,并暂停当前协程直到结果准备就绪。asyncio.run_coroutine_threadsafe()
将协程提交到另一个线程中运行的事件循环。该函数返回一个concurrent.futures
future,它有一个阻塞的result()
方法。 (这需要事先在单独的线程中启动事件循环。)有了这两个工具,将asyncio和经典同步代码混合起来并不难。