如何在python 3.5 +

时间:2016-12-22 12:22:00

标签: python asynchronous python-asyncio

我试图在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秒,然后他们都显示。

我做错了什么,如何解释?

3 个答案:

答案 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))