Sobes.tech
Middle
104
questionbank

Что такое функция wait()?

Ответ от нейросети

sobes.tech AI

В контексте асинхронного программирования на Python с использованием модуля asyncio, функция asyncio.wait() используется для ожидания завершения нескольких кораутин.

Основные аспекты:

  • Возвращает две кортежи: (done, pending).
    • done: Множество кораутин, которые завершились (выдали результат, вызвали исключение или были отменены).
    • pending: Множество кораутин, которые еще не завершились.
  • Принимает итерируемый объект из кораутин (или объектов, ожидающих завершения, таких как задачи).
  • Позволяет контролировать условия завершения ожидания:
    • return_when: Определяет, когда wait должен вернуться. Может быть asyncio.FIRST_COMPLETED, asyncio.FIRST_EXCEPTION, asyncio.ALL_COMPLETED (значение по умолчанию).
    • timeout: Максимальное время ожидания в секундах. Если какие-либо задачи не завершились в течение этого времени, они помещаются в набор pending.
  • В отличие от asyncio.gather(), которая возвращает результаты в виде списка после завершения всех кораутин, asyncio.wait() возвращает сеты выполненных и незавершенных кораутин и не собирает результаты автоматически.

Пример использования:

import asyncio

async def coro1():
    await asyncio.sleep(1)
    print("coro1 finished")
    return "Result 1"

async def coro2():
    await asyncio.sleep(2)
    print("coro2 finished")
    # raise ValueError("Something went wrong")
    return "Result 2"

async def main():
    task1 = asyncio.create_task(coro1())
    task2 = asyncio.create_task(coro2())

    # Ждем завершения всех задач
    done, pending = await asyncio.wait([task1, task2], return_when=asyncio.ALL_COMPLETED)

    print("Wait finished")

    for task in done:
        try:
            result = task.result()
            print(f"Task result: {result}")
        except Exception as e:
            print(f"Task raised exception: {e}")

asyncio.run(main())