我有一个父函数,它应该在数据集上运行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 创建和处理条件的基本示例。
答案 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.gather
或asyncio.wait_for
等功能为您完成。