Код: Выделить всё
import asyncio
import os
import sys
queue = asyncio.Queue(maxsize=0)
async def worker():
try:
while True:
task = await queue.get()
print(f'processing task: {task}')
queue.task_done()
except asyncio.QueueShutDown:
return
def on_read():
data = os.read(0, 10)
if data:
queue.put_nowait(data)
else:
queue.shutdown()
loop = asyncio.new_event_loop()
loop.add_reader(0, on_read)
loop.run_until_complete(worker())
Код: Выделить всё
for i in $(seq 3); do echo $i; sleep 1; done | python3 minimal_queue.py
Код: Выделить всё
maxsize=0Я думал об изменении этого параметра, чтобы установить максимальный размер очереди, а затем использовать цикл.create_task(queue.put(data)). Но я не уверен в этом. Я предполагаю, что при стрессе это просто поставит в очередь массу заблокированных задач, которые могут заполнить память еще быстрее.
Третий вариант — придерживаться put_nowait() и по-прежнему использовать maxsize=0. Это приведет к сбою гораздо раньше, но не съест всю память в системе и, следовательно, окажет меньшее влияние на другие процессы в системе.
Сейчас я склоняюсь к третьему варианту. Но я не уверен, что до конца понимаю, как работают эти очереди. Верны ли мои рассуждения?
Подробнее здесь: https://stackoverflow.com/questions/798 ... th-maxsize
Мобильная версия