Python 3.4+Асинхронное программированиепонятие
asyncio.PriorityQueue
очередь
Асинхронная очередь с приоритетом: get() отдаёт наименьший элемент. Обычно кладут кортежи (приоритет, данные).
Синтаксис
q = asyncio.PriorityQueue(); await q.put((priority, data)); priority, data = await q.get()
Элементы сравниваются целиком: при равных приоритетах кортежи сравниваются по второму полю, и если там словари или объекты без порядка — TypeError в момент put(). Поэтому кладут (приоритет, счётчик, данные), где счётчик ещё и сохраняет порядок поступления. Меньшее число — более высокий приоритет; для «больше — важнее» приоритет берут со знаком минус.
Примеры
import asyncio
async def main():
q = asyncio.PriorityQueue()
for prio, job in [(2, 'отчёт'), (1, 'авария'), (3, 'почта')]:
await q.put((prio, job))
await asyncio.sleep(0.01)
while not q.empty():
print(await q.get()) # → (1, 'авария') / (2, 'отчёт') / (3, 'почта')
asyncio.run(main())
import asyncio
async def main():
q = asyncio.PriorityQueue()
await q.put((1, {'id': 'a'}))
try:
await q.put((1, {'id': 'b'})) # равный приоритет — сравнение словарей
except TypeError as e:
print(type(e).__name__) # → TypeError
await asyncio.sleep(0.01)
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности