前言:

今天就写点gevent的高级点的用法,对于我来说 这些也是常用的gevent模块。

gevent的AsyncResutl模块的用途,看字眼的意思是一个异步的任务的结果。 其实官方的说法也让人有些发蒙。  其实说白了就是协程间的通信,我是老板,让大哥和小弟同事去收账,小弟做完了后,会等大哥来问话。 如果小弟没有完成,还在做着事情,那大哥会在一个时间里,等待小弟返回结果。一直等 !

在实战中这个就很有意思了。   我们同时做一个事情,但是我们又需要互相的帮助,或者是互相的通信。  这个时候就可以用asyncresult。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#coding:utf-8
#http://rfyiamcool.blog.51cto.com/1030776/1538367
import gevent
from gevent.event import AsyncResult
= AsyncResult()
def xiaodi():
    """
    一会堵上10秒 !
    """
    print "xiaodi 开始"
    gevent.sleep(10)
    a.set('hello world')
    print "xiaodi 结束"
def dage():
    """
    需要等待xiaodi完事了后,他才能i live
    """
    print 'dage 这里是先开始的...'
    print a.get() # blocking
    print 'I live!'
gevent.joinall([
    gevent.spawn(xiaodi),
    gevent.spawn(dage),
])

这里是gevent的事件用法。rawlink是注册一个回调,wait是等待任务的完成之后,才能后续进行。    他的用法有些像twisted的一些思想,注册事件,事件和回调函数关联。    gevent最大的优势是用同步的写法,实现异步的功能。 所以这功能不太实用。

e = Event()

e.rawlink(callback_def)

e.wait()

e.xxx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#coding:utf-8
#http://rfyiamcool.blog.51cto.com/1030776/1538367
import gevent
import time
def event_setter(e):
    print '开始搞了...'
    e.rawlink(event_callback)
    gevent.sleep(2)
    print '222...'
    e.set()
def event_waiter(e):
    print '等待...'
    e.wait()
    print '等待 end'
def event_callback(e):
    print "回调..."
def try_event():
    from gevent.event import Event
    = Event()
    gevent.joinall([
        gevent.spawn(event_setter, e),
        gevent.spawn(event_waiter, e),
        gevent.spawn(event_waiter, e),
        gevent.spawn(event_waiter, e),
        gevent.spawn(event_waiter, e),
        gevent.spawn(event_waiter, e),
        gevent.spawn(event_waiter, e),
    ])
try_event()

gevent自己有个gevent.queue,我自己没做测试,倒是看一些老外再谈论,在数据大的数据的时候,要比pyhton queue本身的队列要抗用。

gevent queue 的队列功能很是丰富 !

1
2
3
4
5
6
7
8
>>> queue = gevent.queue.Queue()
>>> queue.put(1)
>>> queue.put(2)
>>> queue.put(StopIteration)
>>> for item in queue:
...    print item
1
2

原文: http://rfyiamcool.blog.51cto.com/1030776/1538367

下面是一个比较完整的例子,大家跑跑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import gevent from gevent.queue import Queue
tasks = Queue()def worker(n):
    while not tasks.empty():
        task = tasks.get()        print('Worker %s got task %s' % (n, task))
        gevent.sleep(0)    print('Quitting time!')def boss():
    for in xrange(1,25):
        tasks.put_nowait(i)
gevent.spawn(boss).join()
gevent.joinall([
    gevent.spawn(worker, 'fuck shencan'),
    gevent.spawn(worker, 'fuck zb'),
    gevent.spawn(worker, 'fuck liudehua'),
])

gevent队列的方法还是很牛叉的。 比如put 推送队列,get取出队列,里面可以加几个选项 堵塞和超时时间。

1
2
3
4
5
6
7
8
9
put(item, block=True, timeout=None) 往队列放入数据,可选是否阻塞和超时时间
put_nowait(item) 非阻塞的往队列放入数据,队列已满时抛出Full Exception
get(block=True, timeout=None) 从队列读出数据,可选是否阻塞和超时时间
get_nowait() 费阻塞地从队列读出数据,队列为空是抛出Empty Exception
peek(block=True, timeout=None) 和get()类似,但获取的数据不会从队列移除
peek_nowait() 类似get_nowait()
empty() 队列为空返回True
full() 队列已满返回True
qsize() 返回队列长度,即队列中的数据数,而非Queue(maxlength)初始化时的maxlength

原文:http://rfyiamcool.blog.51cto.com/1030776/1538367

外加一个gevent执行状态的判断。

1
2
3
4
5
started  表明是否gevent已经开始
ready()  表明是否gevent已经停止
successful()  表明是否gevent已经停止并且没有抛出异常
value --  任意,gevent返回的值
exception --  gevent异常,gevent内部实例没有被捕抓的异常

本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1538367,如需转载请自行联系原作者

关于gevent的协程间通信及队列和事件event用法相关推荐

  1. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

  2. 爬取小说2--协程间通信Python

    通过Python进行协程间通信,大大加速爬取效率. 前言 是这样的,在之前的爬虫版本中,我们通过并发技术(python协程只是并发).实现快速爬取小说的效果. 将速度提高为原来的几百倍了.但是却由于之 ...

  3. 转:Linux--进程间通信(信号量,共享内存)

    源地址:http://www.cnblogs.com/forstudy/archive/2012/03/26/2413724.html Linux--进程间通信(信号量,共享内存)(转) 一. 信号量 ...

  4. OS--进程间通信详解(二)

    OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...

  5. OS--进程间通信详解(一)

    OS–进程间通信详解(一) 文章目录 OS--进程间通信详解(一) 一.进程间通信 1.竞态条件 2.临界区 3.忙等互斥 屏蔽中断 锁变量 严格轮询法 Peterson 解法 TSL指令 4.睡眠与 ...

  6. Python浅谈gevent实现协程

    每日一怼:垃圾桶都收到花了,你却没有 认识gevent之前我们先来认识一下协程,什么是协程? 在笔者的看来就是在A程序与B程序的反复调用执行. 当A程序执行结束后调用执行B程序,B程序结束后调用A程序 ...

  7. python多线程文件的数据续传_python38 1.线程一堆队列 2.事件Event 3.协程 4.断点续传...

    复习 1.GIL锁 2.如何避免GIL锁给程序带来的效率影响 3.与自定义锁的区别 4. 线程池进程池 5 同步 异步 6.异步回调 1.GIL锁 ​ 全局解释器锁, 用来锁住解释器的互斥锁 ​ 为啥 ...

  8. python使用gevent实现协程

    gevent是一个基于协程的python网络库,在遇到IO阻塞时,程序会自动进行切换,可以让我们用同步的方式写异步IO代码. # coding:utf8 import requests import ...

  9. 协程的概念及Python中利用第三方库gevent使用协程

    提到程序的并发操作,大多数人程序员首先想到的进程或者线程.我们先复习一下进程和线程的概念.   进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的 ...

最新文章

  1. Log4j显示异常的奇怪问题
  2. android下拉会谈效果,Android实现下拉展示条目效果
  3. 彻底理解HashMap的元素插入原理
  4. CSS 属性 - 伪类和伪元素的区别
  5. 数据结构之堆:堆的排序,Python代码实现——13
  6. 洛阳计算机学校排名2015年,洛阳最好的中专学校有哪些 十大中专学校排名
  7. 重新认识Java包的命名规则
  8. 全球与中国调频广播发射机市场深度研究分析报告
  9. 【PC工具】windows免安装录屏绿色软件,无需注册无水印绿色录屏软件
  10. linux ubuntu安装教程 pdf,Ubuntu下安装PDF阅读器Okular
  11. C 语言中结构体中成员所占内存的大小
  12. 计算机硬盘根目录是什么,根目录是什么(d盘根目录是什么意思)
  13. 51 Best DevOps Tools for #DevOps Engineers
  14. 电脑显示无法加载远程访问连接管理服务器,Win7系统宽带连接出现错误711无法加载远程访问连接管理器服务如何解决?...
  15. 姓莫的女孩子叫什么名字好听
  16. spring之AOP切面不生效!!!!!原因在这
  17. 追源索骥:透过源码看懂Flink核心框架的执行流程--来自GitHub
  18. 浅谈LZSS与游戏图片破解
  19. CSUOJ 1726 你经历过绝望吗?两次!(BFS + 优先队列)
  20. java 七巧板油漆问题_《七巧板中的分数问题》评课稿

热门文章

  1. 在一个递增有序链表中插入新结点并保持链表递增顺序不变
  2. 21天Jenkins打卡Day9-保留构建
  3. 对C语言实验报告的建议,c语言实验报告.docx
  4. 接口测试要测试什么?
  5. 《Java并发编程的艺术》:第1章 并发编程的挑战
  6. axios post json_助你解析Axios原理之一:如何实现多种请求方式
  7. 三国将星录java阵容_三国将星录,通关攻略
  8. html帧动画效果,利用css3-animation实现逐帧动画效果
  9. excel表中怎么插入visio_如何插入或 Visio 中粘贴的 Excel 工作表-阿里云开发者社区...
  10. opencv+python机读卡识别