關於gevent的協程間通訊及隊列和事件event用法

來源:互聯網
上載者:User

標籤: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" />


本文出自 “峰雲,就她了。” 部落格,謝絕轉載!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.