создавать и обрабатывать условия с помощью asyncio

avatar
Kibo
8 апреля 2018 в 06:47
336
1
0

У меня есть родительская функция, которая должна выполнить 2 теста на наборе данных. если какой-либо из этих тестов не пройден, родительская функция должна вернуть ошибку. Я хочу запустить эти 2 теста асинхронно с asyncio, и как только один из тестов завершится ошибкой, родительская функция должна вернуть ошибку и отменить другой тест.
Я новичок в asyncio и прочитал несколько примеров с условием здесь, но не смог понять, как писать 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)

avatar
user4815162342
8 апреля 2018 в 07:23
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, сделать это за вас.