zoukankan      html  css  js  c++  java
  • python中利用队列asyncio.Queue进行通讯详解

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

    本文主要给大家介绍了关于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: starting
    consumer 0: waiting for item
    consumer 1: starting
    consumer 1: waiting for item
    producer: starting
    producer: added task 0 to the queue
    producer: added task 1 to the queue
    consumer 0: has item 0
    consumer 1: has item 1
    producer: added task 2 to the queue
    producer: added task 3 to the queue
    consumer 0: waiting for item
    consumer 0: has item 2
    producer: added task 4 to the queue
    consumer 1: waiting for item
    consumer 1: has item 3
    producer: added task 5 to the queue
    producer: adding stop signals to the queue
    consumer 0: waiting for item
    consumer 0: has item 4
    consumer 1: waiting for item
    consumer 1: has item 5
    producer: waiting for queue to empty
    consumer 0: waiting for item
    consumer 0: has item None
    consumer 0: ending
    consumer 1: waiting for item
    consumer 1: has item None
    consumer 1: ending
    producer: ending
    总结
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值.

  • 相关阅读:
    mat工具记录一次full gc的过程
    2021年官网下载各个版本JDK最全版与官网查阅方法
    如何用vmkping命令调试vsphere环境中的VMkernel网络连接(ISCSI 开启巨帧)
    vsphere 虚拟机的迁移,冷迁移,vmotion(热迁移)
    VMkernel 级别的 TCP/IP 堆栈解释
    Ubuntu/Linux 开机运行指定的命令/自动运行命令
    桌面信息软件Desktop Info配置
    Windows10下插入USB串口设备后鼠标跳屏问题——Microsoft Serial Ballpoint
    Windows桌面配置常用软件总结
    安装Linux双系统取消快速启动,为什么在双启动时禁用Windows 8上的快速启动?
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586438.html
Copyright © 2011-2022 走看看