异步网络请求并按顺序接收返回结果



  • 问题描述:

    当客户端请求服务器数据时,服务器先查询数据库获取一个存有id的list,并且需要遍历这个list按照顺序去post请求给图片服务器,图片服务器通过id返回图片实际的url地址。在这个过程中请求的形式是串行的,我们可以通过异步请求去提升请求的速度,但是此时需要管理请求返回的顺序。

    为了简化上述过程,可以采用gevent去解决此类问题。

    pip install gevent

    串行测试代码:

    import gevent
    
    urls = ['bbs.ghostasm.com','www.google.com','www.facebook.net']
    
    def post_func(url):
        print "post data to :"+url
        gevent.sleep(5)
        return "recv_data:"+url
    
    values = [post_func(url) for url in urls]
    print [v for v in values]
    
    

    异步测试代码:

    import gevent
    
    urls = ['bbs.ghostasm.com','www.google.com','www.facebook.net']
    
    def post_func(url):
        print "post data to :"+url
        gevent.sleep(5)
        return "recv_data:"+url
    
    jobs = [gevent.spawn(post_func, url) for url in urls]
    gevent.joinall(jobs)
    print [job.value for job in jobs]
    


  • 嗯,python的多线程就是个假的,没有利用多核资源。多进程+携程才是经典



  • @裸奔的de饺子
    gevent底层采用了greenlet实现协程,协程并非多进程也不是多线程😒
    协程是单线程,所以比多线程省去了切换的开销。由于是单线程,也不需要使用锁机制。
    如果想充分利用CPU多核的优势,那么可以使用多进程+协程。😀



  • gevent 和concurrent.futures下的多进程和多线程有啥区别呢


Log in to reply