Какие три вида табличных объектов есть в asyncio?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В asyncio есть три основных вида табличных (или контейнерных) объектов для управления асинхронными операциями:
-
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()) -
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()) -
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 |