异步队列多生产者(同步)单个消费者

时间:2018-11-24 10:58:12

标签: python-3.x python-asyncio

asyncio程序有两个任务,它们产生的消息被放入队列中,另一个任务消耗该队列。

一个生产者产生定期任务。 另一个生产者必须与消费者同步,它必须等到其自己的信息被消费为止

import asyncio
import logging
import sys

logging.basicConfig( stream=sys.stdout,format='%(asctime)-5s: %(funcName)-15s: %(message)s',datefmt='%I:%M:%S',level=logging.INFO)
logger = logging.getLogger()

async def sync_producer(queue):
    for x in range(5):
        item = f"sync producer{x}"
        logger.info(f"{item} ")
        await queue.put(item)# <= at this point I want to await that the message have been consumed 
    logger.info(f"sync producer finish")

async def periodic_producer(queue):
    x=0
    while True:
        await asyncio.sleep(1)
        item = f"periodic producer {x}"
        logger.info(f"{item} ")
        queue.put_nowait(item)
        x+=1

async def consumer(queue):
    while True:
        item = await queue.get()
        logger.info(f"{item}")
        queue.task_done()
        await asyncio.sleep(1)

async def main():
    queue = asyncio.Queue()
    consumer_task = asyncio.create_task(consumer(queue))
    periodic_producer_task = asyncio.create_task(periodic_producer(queue))
    producer_task = asyncio.create_task(sync_producer(queue))

    await producer_task
    periodic_producer_task.cancel()
    await queue.join()
    consumer_task.cancel()

asyncio.run(main())

该示例不起作用,因为我希望await queue.put(item)不等待queue task_done()。 可能的解决方法是将队列(event,item)放到event = asyncio.Event(),然后再放置await event。那是一个“好”的工作原理吗?

0 个答案:

没有答案