asyncio:如何在不强制完全暴露于asyncio的情况下组合同步代码

时间:2019-03-08 20:22:50

标签: python python-asyncio

似乎python的asyncio是一项全有或全无的交易。具体来说,这似乎迫使完整的调用堆栈具有异步感知能力。

这里是一个例子:

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

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

现在让我们假设函数 b()在不同环境中的实现方式可能不同,并且一个人可能想在异步事件循环(使用中调用 a() > loop.call_soon())与 b()调用一些异步感知代码:

def b():
   await .... # this forces b() to be declared async.

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

1 个答案:

答案 0 :(得分:0)

尽管以票面价值异步 是全有或全无的交易,但在处理遗留或异构环境时仍然有两个逃生舱口可以提供帮助:

  • 在asyncio中,您可以等待loop.run_in_executor(callable, args...)在另一个线程中评估同步代码,并挂起当前的协程直到结果准备就绪。

  • 在异步之外,您可以使用asyncio.run_coroutine_threadsafe()向在另一个线程中运行的事件循环提交协程。该函数返回一个concurrent.futures future,它具有一个阻塞function addlesson(){ global $numles; echo "heden hicheel songoh oruulah"; echo "<input type=\"number\" id=\"myNumber\" value = \"1\">"; echo "<button onclick = \"myFunction()\">oruulah</button>"; echo "<script> function myFunction() { $numles = document.getElementById(\"myNumber\").value; } </script>"; } 方法。 (这需要事先在单独的线程中启动事件循环。)

有了这两个工具,将asyncio和经典同步代码混合起来并不难。