流生产者和使用asyncio的消费者收集python

时间:2018-06-13 16:20:30

标签: python-3.x queue python-asyncio asyncsocket

我为套接字服务器编写了一个脚本,它只是监听传入的连接并处理传入的数据。所选择的体系结构是套接字管理的asyncio.start_server和用于在生产者和消费者协同程序之间传递数据的asyncio.Queues。问题是consume(q1)函数只执行一次(在第一个脚本启动时)。然后它不再执行。行run_until_complete(asyncio.gather())错了吗?

import asyncio
import functools

async def handle_readnwrite(reader, writer, q1): #Producer coroutine
    data = await reader.read(1024)
    message = data.decode()
    await writer.drain()
    await q1.put(message[3:20])
    await q1.put(None)
    writer.close() #Close the client socket

async def consume(q1): #Consumer coroutine
    while True:
        # wait for an item from the producer
        item = await q1.get()
        if item is None:
            logging.debug('None items') # the producer emits None to indicate that it is done
            break
        do_something(item)

loop = asyncio.get_event_loop()
q1 = asyncio.Queue(loop=loop)
producer_coro = asyncio.start_server(functools.partial(handle_readnwrite, q1=q1), '0.0.0.0', 3000, loop=loop)
consumer_coro = consume(q1)
loop.run_until_complete(asyncio.gather(consumer_coro,producer_coro))

try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

loop.close()

1 个答案:

答案 0 :(得分:1)

handle_readnwrite总是将None终止符排入队列,导致consume中断(因此完成协程)。如果consume应继续运行并处理其他消息,则不得在每封消息后发送None终结符。