Вопрос проверяет знание основных инструментов и утилит asyncio для эффективной работы с асинхронным кодом.
Asyncio предоставляет инструменты для управления корутинами: Task для параллельного выполнения, Queue для коммуникации, Lock для синхронизации, Event для уведомлений, и Semaphore для ограничения параллелизма.
Библиотека asyncio предлагает богатый набор инструментов для построения асинхронных приложений.
Основные инструменты:
1. Task - управление корутинами:
import asyncio
async def worker(name):
print(f"{name} начал работу")
await asyncio.sleep(1)
print(f"{name} завершил работу")
async def main():
# Создание и запуск задач
task1 = asyncio.create_task(worker("Работник 1"))
task2 = asyncio.create_task(worker("Работник 2"))
# Ожидание завершения
await task1
await task2
asyncio.run(main())2. Queue - коммуникация между корутинами:
import asyncio
async def producer(queue):
for i in range(5):
await queue.put(f"элемент {i}")
await asyncio.sleep(0.1)
await queue.put(None) # Сигнал завершения
async def consumer(queue):
while True:
item = await queue.get()
if item is None:
break
print(f"Обработано: {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
await asyncio.gather(
producer(queue),
consumer(queue)
)
asyncio.run(main())3. Synchronization primitives:
Lock: исключительный доступ к ресурсу
Event: уведомление между корутинами
Semaphore: ограничение количества одновременных операций
4. Utilities:
asyncio.gather(): параллельное выполнение
asyncio.wait(): ожидание с условиями
asyncio.sleep(): асинхронная задержка