關於gevent的Timeout(超時)問題


真的是內牛滿面啊,雖然4個月前就開始用gevent,但是直到今天才知道到底怎么才能設置gevent(含monkey打patch后)的超時!!

官方文檔太坑爹了,在很隱藏的一個角落里才發現這么一個類gevent.Timeout。

事情是這樣的:我們常用的socket都是阻塞的,那么超時是很好設置的。但是,用過Linux下非阻塞I/O的都知道,非阻塞情況下,設置連接超時神馬都是浮雲的,因為人家是非阻塞的……

於是,當我們用monkey.patch_all()之后,所有的socket都會被轉化位非阻塞的,於是在urllib2.open(xx,timeout=yy)這里yy就無效了!

怎么辦?用gevent其實提供了這個Timeout類,當你的類似sleep(由於I/O、sleep等原因掛起)超時超過了Timeout的時間限制后,會自動終止block,跳出。

怎么模擬一個超時事件呢,很簡單,我們在monkey打了patch后,非FQget一把訪問twitter,默認情況,會很長時間才返回的哦!

import gevent
import gevent.monkey
import urllib

gevent.monkey.patch_all()

def test():
    #就這么用,7是超時時間,后面的False表示不拋出其他異常了!
    with gevent.Timeout(7, False) as timeout:
        urllib.urlopen("http://www.twitter.com")

if __name__ == "__main__":
    g = gevent.spawn(test)
    g.join()

然后,一旦到了7秒,我們的程序就會乖乖的自動返回啦!

這個夜真沒白熬……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM