Назад к вопросам
Middle+
155
questionbank

Какие три вида табличных объектов есть в asyncio?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

В asyncio есть три основных вида табличных (или контейнерных) объектов для управления асинхронными операциями:

  1. Tasks: Объекты, инкапсулирующие сопрограммы (coroutines) и позволяющие планировать их выполнение в цикле событий. Tasks представляют собой более высокоуровневую абстракцию по сравнению с сопрограммами, позволяя их отменять, проверять статус и получать результаты.

    # Создание задачи из сопрограммы
    async def my_coro():
        await asyncio.sleep(1)
        return "done"
    
    async def main():
        task = asyncio.create_task(my_coro())
        result = await task
        print(result)
    
    # asyncio.run(main())
    
  2. Futures: Низкоуровневые объекты, представляющие собой результат асинхронной операции, который будет доступен в будущем. Futures могут быть разрешены (resolved) с результатом или исключением. Tasks являются подклассами Futures.

    # Пример работы с Future (обычно используется через Tasks)
    async def set_future_result(future):
        await asyncio.sleep(1)
        future.set_result("future done")
    
    async def main_future():
        loop = asyncio.get_running_loop()
        future = loop.create_future() # Создание Future
        loop.create_task(set_future_result(future))
        result = await future # Ожидание результата
        print(result)
    
    # asyncio.run(main_future())
    
  3. Queues: Асинхронные очереди, предназначенные для безопасного обмена данными между несколькими сопрограммами. Они реализуют асинхронные методы put() и get(), которые блокируются до тех пор, пока операция не может быть выполнена (например, очередь полна при put() или пуста при get()).

    # Использование асинхронной очереди
    async def producer(queue):
        for i in range(5):
            await queue.put(f"item {i}")
            print(f"Produced item {i}")
            await asyncio.sleep(0.1)
    
    async def consumer(queue):
        while True:
            item = await queue.get()
            print(f"Consumed {item}")
            queue.task_done() # Сообщаем, что элемент обработан
            if item == "item 4": # Условие выхода
                break
            await asyncio.sleep(0.2)
    
    async def main_queue():
        queue = asyncio.Queue() # Создание очереди
        producer_task = asyncio.create_task(producer(queue))
        consumer_task = asyncio.create_task(consumer(queue))
    
        await producer_task
        await queue.join() # Ожидание обработки всех элементов
        consumer_task.cancel() # Отмена потребителя после обработки
        try:
            await consumer_task
        except asyncio.CancelledError:
            print("Consumer cancelled")
    
    # asyncio.run(main_queue())
    

Таблица, обобщающая основные различия:

Объект Назначение Связь Основные методы
Task Планирование и управление выполнением сопрограмм Наследник Future create_task, cancel, done, result
Future Низкоуровневое представление результата Базовый класс для Task set_result, set_exception, done
Queue Безопасный обмен данными между сопрограммами Используется для communication pattern put, get, join, task_done, empty, full