標籤:gevent queue gevent event gevent asyncresult
前言:
今天就寫點gevent的進階點的用法,對於我來說 這些也是常用的gevent模組。
gevent的AsyncResutl模組的用途,看字眼的意思是一個非同步任務的結果。 其實官方的說法也讓人有些發矇。 其實說白了就是協程間的通訊,我是老闆,讓大哥和小弟同事去收賬,小弟做完了後,會等大哥來問話。 如果小弟沒有完成,還在做著事情,那大哥會在一個時間裡,等待小弟返回結果。一直等 !
在實戰中這個就很有意思了。 我們同時做一個事情,但是我們又需要互相的協助,或者是互相的通訊。 這個時候就可以用asyncresult。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/45/56/wKiom1PnhUWzgzDyAALebVnD0sk717.jpg" title="000.jpg" alt="wKiom1PnhUWzgzDyAALebVnD0sk717.jpg" />
#coding:utf-8#http://rfyiamcool.blog.51cto.com/1030776/1538367import geventfrom gevent.event import AsyncResulta = 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),])
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/45/56/wKiom1PnhcfCgQR1AACraArCixU937.jpg" title="1111.jpg" alt="wKiom1PnhcfCgQR1AACraArCixU937.jpg" />
這裡是gevent的事件用法。rawlink是註冊一個回調,wait是等待任務的完成之後,才能後續進行。 他的用法有些像twisted的一些思想,註冊事件,事件和回呼函數關聯。 gevent最大的優勢是用同步的寫法,實現非同步功能。 所以這功能不太實用。
e = Event()
e.rawlink(callback_def)
e.wait()
e.xxx
#coding:utf-8#http://rfyiamcool.blog.51cto.com/1030776/1538367import geventimport timedef 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 e = 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()
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/45/57/wKioL1Pnh1_BrCEqAADmho95wNE429.jpg" title="333.jpg" alt="wKioL1Pnh1_BrCEqAADmho95wNE429.jpg" />
gevent自己有個gevent.queue,我自己沒做測試,倒是看一些老外再談論,在資料大的資料的時候,要比pyhton queue本身的隊列要抗用。
gevent queue 的隊列功能很是豐富 !
>>> queue = gevent.queue.Queue()>>> queue.put(1)>>> queue.put(2)>>> queue.put(StopIteration)>>> for item in queue:... print item12
原文: http://rfyiamcool.blog.51cto.com/1030776/1538367
下面是一個比較完整的例子,大家跑跑:
import gevent from gevent.queue import Queuetasks = 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 i 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‘),])
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/45/56/wKiom1PnhtzwO_JeAAKZRTYXFXo430.jpg" title="444.jpg" alt="wKiom1PnhtzwO_JeAAKZRTYXFXo430.jpg" />
gevent隊列的方法還是很牛叉的。 比如put 推送隊列,get取出隊列,裡面可以加幾個選項 堵塞和逾時時間。
put(item, block=True, timeout=None) 往隊列放入資料,可選是否阻塞和逾時時間put_nowait(item) 非阻塞的往隊列放入資料,隊列已滿時拋出Full Exceptionget(block=True, timeout=None) 從隊列讀出資料,可選是否阻塞和逾時時間get_nowait() 費阻塞地從隊列讀出資料,隊列為空白是拋出Empty Exceptionpeek(block=True, timeout=None) 和get()類似,但擷取的資料不會從隊列移除peek_nowait() 類似get_nowait()empty() 隊列為空白返回Truefull() 隊列已滿返回Trueqsize() 返回隊列長度,即隊列中的資料數,而非Queue(maxlength)初始化時的maxlength
原文:http://rfyiamcool.blog.51cto.com/1030776/1538367
外加一個gevent執行狀態的判斷。
started 表明是否gevent已經開始ready() 表明是否gevent已經停止successful() 表明是否gevent已經停止並且沒有拋出異常value -- 任意,gevent返回的值exception -- gevent異常,gevent內部執行個體沒有被捕抓的異常
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/45/57/wKioL1PnjTOgO7K3AAOYOijH5_w822.jpg" title="aaa.jpg" alt="wKioL1PnjTOgO7K3AAOYOijH5_w822.jpg" />
本文出自 “峰雲,就她了。” 部落格,謝絕轉載!