关于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,默认情况,会很长时间才返回的哦!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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秒,我们的程序就会乖乖的自动返回啦!
这个夜真没白熬……
posted on 2020-07-21 17:56 ExplorerMan 阅读(1992) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步