zoukankan      html  css  js  c++  java
  • python gevent mokey

    #eg: monkey的理解

    import gevent
    import socket
     
    urls = ['www.baidu.com', 'www.gevent.org', 'www.python.org']
    jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
    gevent.joinall(jobs, timeout=5)
     
    print [job.value for job in jobs]
    我们通过协程分别获取三个网站的IP地址,由于打开远程地址会引起IO阻塞,所以gevent会自动调度不同的协程。另外,我们可以通过协程对象的”value”属性,来获取协程函数的返回值。
    
    猴子补丁 Monkey patching
    细心的朋友们在运行上面例子时会发现,其实程序运行的时间同不用协程是一样的,是三个网站打开时间的总和。可是理论上协程是非阻塞的,那运行时间应该等于最长的那个网站打开时间呀?其实这是因为Python标准库里的socket是阻塞式的,DNS解析无法并发,包括像urllib库也一样,所以这种情况下用协程完全没意义。那怎么办?
    
    一种方法是使用gevent下的socket模块,我们可以通过”from gevent import socket”来导入。不过更常用的方法是使用猴子布丁(Monkey patching):
    
    
    from gevent import monkey; monkey.patch_socket()
    import gevent
    import socket
     
    urls = ['www.baidu.com', 'www.gevent.org', 'www.python.org']
    jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
    gevent.joinall(jobs, timeout=5)
     
    print [job.value for job in jobs]
    上述代码的第一行就是对socket标准库打上猴子补丁,此后socket标准库中的类和方法都会被替换成非阻塞式的,所有其他的代码都不用修改,这样协程的效率就真正体现出来了。Python中其它标准库也存在阻塞的情况,gevent提供了”monkey.patch_all()”方法将所有标准库都替换。

     http://www.bjhee.com/gevent.html

  • 相关阅读:
    action里设置session
    用Eclipse导出能直接运行的jar包
    linux下命令行运行jar文件出错
    扫描对方主机端口
    调用Axis Webservice异常: java.net.ConnectException: Connection timed out: connect
    PL/SQL 安装出现的一些问题
    调用Axis WebService异常:org.xml.sax.SAXException: Bad envelope tag: definitions
    开通博客第一天
    正则表达式
    匿名函数
  • 原文地址:https://www.cnblogs.com/cbugs/p/9850172.html
Copyright © 2011-2022 走看看