zoukankan      html  css  js  c++  java
  • 关于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后,非翻墙get一把访问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秒,我们的程序就会乖乖的自动返回啦!

    这个夜真没白熬……

  • 相关阅读:
    IOS之UIAlert​Controller
    IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
    IOS之正则表达式
    死锁与递归锁
    线程与进程的一些应用
    开启线程的两种方式
    互斥锁
    进程的队列
    模拟抢票系统
    Python并发编程__多进程
  • 原文地址:https://www.cnblogs.com/ExMan/p/13356520.html
Copyright © 2011-2022 走看看