真的是內牛滿面啊,雖然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秒,我們的程序就會乖乖的自動返回啦!
這個夜真沒白熬……
