我试图在python中解释一个异步编程的例子但是我失败了。 这是我的代码。
import asyncio
import time
async def asyncfoo(t):
time.sleep(t)
print("asyncFoo")
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncfoo(10)) # I think Here is the problem
print("Foo")
loop.close()
我的期望是我会看到:
Foo
asyncFoo
在显示asyncFoo
之前等待10秒。
但相反,我没有得到任何10秒,然后他们都显示。
我做错了什么,如何解释?
答案 0 :(得分:10)
run_until_complete
将阻止asyncfoo
完成。相反,你需要在循环中执行两个协同程序。使用asyncio.gather
可以使用run_until_complete
轻松启动多个协程。
这是一个例子:
import asyncio
async def async_foo():
print("asyncFoo1")
await asyncio.sleep(3)
print("asyncFoo2")
async def async_bar():
print("asyncBar1")
await asyncio.sleep(1)
print("asyncBar2")
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(async_foo(), async_bar()))
loop.close()
答案 1 :(得分:2)
您的期望会在您将协程作为 R"x(path\path.exe)x"
运行的上下文中运行,而与代码流无关。它可以工作的另一种情况是,如果你并排运行多个Task
,在这种情况下,事件循环将把代码执行从coroutines
变为await
语句。< / p>
在您的示例的上下文中,您可以通过将协程包装在Task对象中来实现预期的行为,该对象将在后台继续运行,而不会占用代码块中的其余代码。调用。
例如。
await
请注意,您应使用import asyncio
async def asyncfoo(t):
await asyncio.sleep(t)
print("asyncFoo")
async def my_app(t):
my_task = asyncio.ensure_future(asyncfoo(t))
print("Foo")
await asyncio.wait([my_task])
loop = asyncio.get_event_loop()
loop.run_until_complete(my_app(10))
loop.close()
代替asyncio.sleep()
模块。
答案 2 :(得分:-1)
run_until_complete
正在阻止。所以,即使它会在10秒内发生,它也会等待它。完成后,将进行另一次打印。
如果您希望之前打印“Foo”,则应在线程或子进程中启动loop.run_until_complete(asyncfoo(10))
。