我的要求是同时运行2个函数,如果另一个函数计算并更快地返回结果,则停止执行一个函数。
我知道异步编程或事件循环的知识。我看了python 3.6,它引导我asyncio.wait()
我的示例代码:
import time
import asyncio as aio
async def f(x):
time.sleep(1) # to fake fast work
print("f say: " + str(x*2))
return x*2
async def s(x):
time.sleep(3) # to fake slow work
print("s say: " + str(x*2))
return x**2
x = 10
assert aio.iscoroutinefunction(f)
assert aio.iscoroutinefunction(s)
futures = {f(x), s(x)}
def executor():
yield from aio.wait(futures, return_when=aio.FIRST_COMPLETED)
done, pending = executor()
但它不是因为一些未知原因而起作用。
答案 0 :(得分:1)
您获得的特定断言与错误使用yield from
有关。然而,问题更深入:
我的要求是同时运行2个功能
这不是asyncio如何工作,没有任何东西同时运行"同时#34;。相反,一个人运行异步函数,这些函数执行到他们达到通常阻塞调用的时间点。而不是阻塞,异步函数然后暂停其执行,允许其他协同程序运行。它们必须由事件循环驱动,它会驱动它们并在某些IO事件允许它们恢复时唤醒它们。
更正确的代码asyncio版本如下所示:
import asyncio
async def f(x):
await asyncio.sleep(1) # to fake fast work
print("f say: " + str(x*2))
return x*2
async def s(x):
await asyncio.sleep(3) # to fake slow work
print("s say: " + str(x*2))
return x**2
async def execute():
futures = {f(10), s(10)}
done, pending = await asyncio.wait(futures, return_when=asyncio.FIRST_COMPLETED)
for fut in pending:
fut.cancel()
return done
loop = asyncio.get_event_loop()
done = loop.run_until_complete(execute())
print(done)
特别注意:
asyncio.sleep()
代替time.sleep()
。这适用于每个阻止呼叫。
使用asyncio.sleep
关键字必须等待等asyncio.wait
和await
等协同程序。这允许协程在遇到阻塞呼叫时暂停。
异步代码通过事件循环执行,其入口点通常为run_until_complete
或run_forever
。