python中利用队列asyncio.Queue进行通讯详解

时间:2021-05-22

前言

本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

asyncio.Queue与其它队列是一样的,都是先进先出,它是为协程定义的

例子如下:

import asyncio async def consumer(n, q): print('consumer {}: starting'.format(n)) while True: print('consumer {}: waiting for item'.format(n)) item = await q.get() print('consumer {}: has item {}'.format(n, item)) if item is None: # None is the signal to stop. q.task_done() break else: await asyncio.sleep(0.01 * item) q.task_done() print('consumer {}: ending'.format(n)) async def producer(q, num_workers): print('producer: starting') # Add some numbers to the queue to simulate jobs for i in range(num_workers * 3): await q.put(i) print('producer: added task {} to the queue'.format(i)) # Add None entries in the queue # to signal the consumers to exit print('producer: adding stop signals to the queue') for i in range(num_workers): await q.put(None) print('producer: waiting for queue to empty') await q.join() print('producer: ending') async def main(loop, num_consumers): # Create the queue with a fixed size so the producer # will block until the consumers pull some items out. q = asyncio.Queue(maxsize=num_consumers) # Scheduled the consumer tasks. consumers = [ loop.create_task(consumer(i, q)) for i in range(num_consumers) ] # Schedule the producer task. prod = loop.create_task(producer(q, num_consumers)) # Wait for all of the coroutines to finish. await asyncio.wait(consumers + [prod]) event_loop = asyncio.get_event_loop() try: event_loop.run_until_complete(main(event_loop, 2)) finally: event_loop.close()

输出如下:

consumer 0: startingconsumer 0: waiting for itemconsumer 1: startingconsumer 1: waiting for itemproducer: startingproducer: added task 0 to the queueproducer: added task 1 to the queueconsumer 0: has item 0consumer 1: has item 1producer: added task 2 to the queueproducer: added task 3 to the queueconsumer 0: waiting for itemconsumer 0: has item 2producer: added task 4 to the queueconsumer 1: waiting for itemconsumer 1: has item 3producer: added task 5 to the queueproducer: adding stop signals to the queueconsumer 0: waiting for itemconsumer 0: has item 4consumer 1: waiting for itemconsumer 1: has item 5producer: waiting for queue to emptyconsumer 0: waiting for itemconsumer 0: has item Noneconsumer 0: endingconsumer 1: waiting for itemconsumer 1: has item Noneconsumer 1: endingproducer: ending

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章