【问题标题】:gevent and socksipygevent 和 socksipy
【发布时间】:2012-11-07 15:07:16
【问题描述】:

我想知道是否有人尝试使用 [gevent][1] 和 [socksipy][2] 进行并发下载。

【问题讨论】:

    标签: python asyncsocket gevent greenlets


    【解决方案1】:

    我使用 gevent 从 yfrog、instagram、twitpic 等下载了大约 12k 张图片。 图片的累积大小约为 1.5Gb,在我家的 wifi 上下载它们需要大约 20 分钟。

    为此,我实现了一个 image_download 函数,其唯一目的是从给定 URL 下载图片,然后使用 gevent.Poolimage_download 函数上异步映射一个 URL 列表。

    from gevent import monkey
    monkey.patch_socket()  # See http://www.gevent.org/gevent.monkey.html
    import gevent
    
    NB_WORKERS = 50
    
    def image_download(url):
        # retrieve image
    
    def parallel_image_download(urls):  # urls is of type list
        """ Activate NB_WORKERS Greenlets to asynchronously download the images. """
        pool = gevent.Pool(NB_WORKERS)
        return pool.map(image_download, urls)
    

    注意:经过几次尝试,我确定了 50 个并行工作器。超过 50,总运行时间没有增加。

    【讨论】:

    • 这是一个有趣的例子。谢谢你分享。我能问你为什么使用 pool.map 而不是 gevent.spawn 吗?它们之间有区别吗?
    • 看看sdiehl.github.com/gevent-tutorial。我的感觉是Pool.map() 为您处理结果收集,我需要获取所有结果的列表。可能你可以使用spawn() 来做同样的事情。我只知道它与map() 配合得很好。
    • 是的,我看过那个教程。为了收集结果,我使用 gevent.joinall 来收集结果。感谢您的见解。
    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2013-11-15
    • 2013-01-27
    • 2012-09-30
    • 2012-09-26
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多