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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值.

python中利用队列asyncio.Queue进行通讯详解的更多相关文章

  1. Python中生成器和yield语句的用法详解

    Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...

  2. python接口自动化(九)--python中字典和json的区别(详解)

    简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...

  3. python模块 re模块与python中运用正则表达式的特点 模块知识详解

    1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...

  4. python中的列表(list) 切片详解

    1.切片: 通过指定下标的方式来获得某一个数据元素,或者通过指定下标范围来获得一组序列的元素,这种访问序列的方式叫做切片.    访问某一个数据元素的的语法如下:    sequence[index] ...

  5. Python中操作HTTP请求的urllib模块详解

    urllib 是 Python 标准库中用于网络请求的库.该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser. ...

  6. Python中strip()、lstrip()、rstrip()用法详解

    Python中有三个去除头尾字符.空白符的函数,它们依次为: strip: 用来去除头尾字符.空白符(包括\n.\r.\t.' ',即:换行.回车.制表符.空格)lstrip:用来去除开头字符.空白符 ...

  7. Python中str.format()字典及list传入详解

  8. python中利用redis构建任务队列(queue)

    Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...

  9. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

随机推荐

  1. 借助Charles来测试移动端-下篇

    本篇是借助Charles来测试移动端的下半篇.(上篇任意门点我) 上次说到可以借助Charles来抓移动端的网络请求,接下来,我们来看一下怎么通过Charles来模拟返回,还是以网页版豆瓣为例. 先找 ...

  2. 使用Pechkin与CPechkin生成PDF

    1. Pechkin     从NuGet程序管理器中获得Pechkin,代码示例如下:             GlobalConfig config = new GlobalConfig();   ...

  3. 使用go语言开发一个后端gin框架的web项目

    用liteide来开发go的后端项目,需要注意的是环境变量要配置正确了 主要是GOROOT, GOPATH, GOBIN, PATH这几个, GOPATH主要用来存放要安的包,主要使用go get 来 ...

  4. php检测函数是否存在函数 function_exists

    php检测函数是否存在函数 function_exists 语法 bool function_exists ( string $function_name )检查的定义的函数的列表,同时内置(内部)和 ...

  5. Codeforces 708D 上下界费用流

    给你一个网络流的图 图中可能会有流量不平衡和流量>容量的情况存在 每调整一单位的流量/容量 需要一个单位的花费 问最少需要多少花费使得原图调整为正确(可行)的网络流 设当前边信息为(u,v,f, ...

  6. Restricting Input in HTML Textboxes to Numeric Values

    Ok, here’s a fairly basic one – how to force a textbox to accept only numeric input. Somebody asked ...

  7. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...

  8. BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]

    吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会, 死磕了很长时间,不想想了,结果码代码又不会码.. 深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了 以下可能是个人 ...

  9. C# 从Object对象中读取属性的值

    https://www.cnblogs.com/xbblogs/p/7739483.html

  10. 走进Github的世界

    1.官网注册账号 2.官网向导: https://guides.github.com/activities/hello-world/ 值得推荐: Git手册: https://git-scm.com/ ...