Considere este exemplo em que tenho 3 tarefas de trabalho que enviam resultados para uma fila e uma tarefa que lida com os dados enviados.
async def worker1(queue: asyncio.Queue):
while True:
res = await do_some_work(param=1)
await queue.put(res)
async def worker2(queue: asyncio.Queue):
while True:
res = await do_some_work(param=2)
await queue.put(res)
async def worker3(queue: asyncio.Queue):
while True:
res = await do_some_work(param=3)
await queue.put(res)
async def handle_results(queue: asyncio.Queue):
while True:
res = await queue.get()
await handle_result(res)
queue.task_done()
async def main():
queue = asyncio.Queue()
t1 = asyncio.create_task(worker1(queue))
t2 = asyncio.create_task(worker2(queue))
t3 = asyncio.create_task(worker3(queue))
handler = asyncio.create_task(handle_result(queue))
while True:
# do some other stuff
....
asyncio.run(main())
A documentação diz que asyncio.Queue
não é thread-safe, mas isso não deveria se aplicar aqui, pois todas as tarefas estão sendo executadas na mesma thread. Mas preciso de um asyncio.Lock
para proteger a fila quando tenho 3 tarefas que enviam para a mesma fila? Observando a implementação em Python 3.12 (que cria um putter
future e aguarda por ele antes de enviar para a fila), eu diria que não , mas não tenho certeza, e a documentação não menciona o que aconteceria neste caso. Então, o asyncio.Lock
neste caso é necessário?