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

  • 相关阅读:
    mysql的安装
    一个电脑登录多个微信
    项目工程构建
    MYSQL 添加字段
    Centos 搭建maven私服
    Nacos 动态刷新@RefreshScope
    Cookie & Session
    阿里蚂蚁 笔试题
    springboot 将配置文件中的配置读取为properties配置类
    .Net Gacutil工具(全局程序集缓存工具)使用教程
  • 原文地址:https://www.cnblogs.com/cbugs/p/9850172.html
Copyright © 2011-2022 走看看