首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
拉勾
V2EX  ›  Python

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

  •  
  •   304464743 · 72 天前 · 475 次点击
    这是一个创建于 72 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么 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 条附言  ·  70 天前
    有加猴子,Import 的代码我没复制上来

    没复制上来的代码如下

    from gevent import monkey; monkey.patch_all()
    import time, datetime, requests
    import gevent
    5 回复  |  直到 2018-10-11 09:49:20 +08:00
        1
    xpresslink   71 天前
    你一个人吃完 5 个馒头,是一个咬一口轮吃快还是吃完一个再吃一个快?

    要是 5 个人每人同时吃一个呢?
        2
    NoAnyLove   71 天前
    猴子呢?
        3
    cosven   71 天前
    这个代码有问题,你没有进行 monkey patch,也就是说,你的 requests.get 是阻塞同步的,而非异步非阻塞。
        4
    304464743   70 天前
    @NoAnyLove 有猴子的,代码没复制上来
        5
    lolizeppelin   69 天前 via Android
    协程单进城的 cpu 只能用一个啊

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

    写法本来就是协程配多进城的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3718 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1