async python - 从引发AssertionError获取正确的参数

时间:2018-02-28 11:12:44

标签: python asynchronous python-asyncio

我的要求是同时运行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()

但它不是因为一些未知原因而起作用。

1 个答案:

答案 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.waitawait等协同程序。这允许协程在遇到阻塞呼叫时暂停。

  • 异步代码通过事件循环执行,其入口点通常为run_until_completerun_forever