我为套接字服务器编写了一个脚本,它只是监听传入的连接并处理传入的数据。所选择的体系结构是套接字管理的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()
答案 0 :(得分:1)
handle_readnwrite
总是将None
终止符排入队列,导致consume
中断(因此完成协程)。如果consume
应继续运行并处理其他消息,则不得在每封消息后发送None
终结符。