使用asyncio创建和处理条件

时间:2018-04-08 06:47:42

标签: python python-asyncio

我有一个父函数,它应该在数据集上运行2次测试。 如果任何这些测试失败,父函数应该返回失败。我想与 asyncio 异步运行这两个测试,一旦其中一个测试失败,父函数应该返回失败并取消另一个测试。
我是 asyncio 的新手,并阅读条件为here的一些示例,但无法弄清楚如何编写带条件的asyncio。
到目前为止,我可以通过在任何失败的测试中抛出异常来处理它。
这是我的基本代码:

async def test1(data):
    # run some test on data and return true on pass and throw exception on fail

async def test2(data):
    # run some test on data and return true on pass and throw exception on fail


ioloop = asyncio.get_event_loop()
tasks = [ioloop.create_task(test1(data)), ioloop.create_task(test2(data))]
finished, unfinished = ioloop.run_until_complete(asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION))

但我不认为这是处理条件的正确方法。
所以我想了解如何使用 ayncio 创建和处理条件的基本示例。

1 个答案:

答案 0 :(得分:3)

  

一旦其中一个测试失败,父函数应该返回失败并取消另一个测试。

asyncio.gather会自动执行此操作:

loop = asyncio.get_event_loop()
tasks = [loop.create_task(test1(data)), loop.create_task(test2(data))]
try:
    loop.run_until_complete(asyncio.gather(*tasks))
except FailException:  # use exception raised by the task that fails
    print('failed')

asyncio.gather中执行的任何任务引发异常时,将使用Task.cancel取消所有其他任务,异常将传播到gather的等待者。您根本不需要Condition,取消将自动中断任务等待的阻止操作。

当空闲的任务(或许多此类任务)需要等待某个其他任务中可能发生的事件时,需要条件。在这种情况下,它会等待一个条件,并且通知它正在发生。如果任务只是针对其业务,您可以随时取消,或让asyncio.gatherasyncio.wait_for等功能为您完成。