V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
304464743
V2EX  ›  Python

gevent 为什么测试下来比多进程要慢很多?

  •  
  •   304464743 · 2018-10-08 15:52:51 +08:00 · 3504 次点击
    这是一个创建于 2264 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么 gevent 比多进程慢那么多?是不是只有 gevent 作为 http 服务器的时候才有优势?对于这种主动请求的没优势?

    gevent:40 秒
    ----------------------------------------------------------------
    start_time = time.time()
    urls = ('http://www.baidu.com' for i in range(10000))
    jobs = [gevent.spawn(requests.get, url) for url in urls]
    #print(jobs)
    gevent.joinall(jobs)
    #print([job.value.status_code for job in jobs])
    end_time = time.time()
    print(end_time - start_time)
    ----------------------------------------------------------------
    
    multiprocessing:12 秒
    ----------------------------------------------------------------
    def req(url):
        return requests.get(url).status_code
    
    if __name__ == '__main__':
        start_time = time.time()
        p = Pool(32)
        res_l = []
        for i in range(10000):
            res = p.apply_async(req, args=('http://www.baidu.com',))
            res_l.append(res)
        p.close()
        p.join()
        #print(len([i.get() for i in res_l]))
        end_time = time.time()
        print(end_time - start_time)
    ----------------------------------------------------------------
    
    第 1 条附言  ·  2018-10-10 11:52:15 +08:00
    有加猴子,Import 的代码我没复制上来

    没复制上来的代码如下

    from gevent import monkey; monkey.patch_all()
    import time, datetime, requests
    import gevent
    6 条回复    2019-11-21 13:19:48 +08:00
    xpresslink
        1
    xpresslink  
       2018-10-08 18:13:24 +08:00
    你一个人吃完 5 个馒头,是一个咬一口轮吃快还是吃完一个再吃一个快?

    要是 5 个人每人同时吃一个呢?
    NoAnyLove
        2
    NoAnyLove  
       2018-10-09 11:06:07 +08:00
    猴子呢?
    cosven
        3
    cosven  
       2018-10-09 13:43:54 +08:00
    这个代码有问题,你没有进行 monkey patch,也就是说,你的 requests.get 是阻塞同步的,而非异步非阻塞。
    304464743
        4
    304464743  
    OP
       2018-10-10 11:55:10 +08:00
    @NoAnyLove 有猴子的,代码没复制上来
    lolizeppelin
        5
    lolizeppelin  
       2018-10-11 09:49:20 +08:00 via Android
    协程单进城的 cpu 只能用一个啊

    Python 主推协程是因为多线程不行

    写法本来就是协程配多进城的
    ysymi
        6
    ysymi  
       2019-11-21 13:19:48 +08:00
    一样遇到这个问题了 楼主有知道为什么吗 ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:47 · PVG 11:47 · LAX 19:47 · JFK 22:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.