似乎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())明确定义为异步协程的情况下实现此功能?
答案 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和经典同步代码混合起来并不难。