• 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
    总结
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值.

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586439.html
Copyright © 2020-2023  润新知