python - 多处理对 urllib2 没用?

标签 python multiprocessing urllib2 gil

我最近尝试使用多处理模块(和它是工作池)。我在这里阅读了一些关于多线程(与标准的非线程版本相比,它减慢了整个过程)和多处理的讨论,但我找不到一个(可能非常简单的)问题的答案:

你能用多处理加速 url 调用吗?还是网络适配器之类的瓶颈?例如,我看不出 urllib2-open-method 的哪一部分可以并行化以及它应该如何工作......

编辑:这是我想要加速的请求和当前的多处理设置:

 urls=["www.foo.bar", "www.bar.foo",...]
 tw_url='http://urls.api.twitter.com/1/urls/count.json?url=%s'

 def getTweets(self,urls):
    for i in urls:
        try:
            self.tw_que=urllib2.urlopen(tw_url %(i))
            self.jsons=json.loads(self.tw_que.read())
            self.tweets.append({'url':i,'date':today,'tweets':self.jsons['count']})
        except ValueError:
            print ....
            continue
    return self.tweets 

 if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)            
    result = [pool.apply_async(getTweets(i,)) for i in urls]
    [i.get() for i in result]

最佳答案

啊,关于 GIL 的又一次讨论来了。好吧,事情是这样的。使用 urllib2 获取内容将主要 IO 绑定(bind)。当任务受 IO 限制时, native 线程和多处理都将具有相同的性能(线程仅在受 CPU 限制时成为问题)。是的,您可以加快速度,我自己使用 python 线程和类似 10 个下载程序线程完成了它。

基本上,您使用生产者-消费者模型,其中一个线程(或进程)生成要下载的 url,N 个线程(或进程)从该队列中消费并向服务器发出请求。N p>

这是一些伪代码:

# Make sure that the queue is thread-safe!!

def producer(self):
    # Only need one producer, although you could have multiple
    with fh = open('urllist.txt', 'r'):
        for line in fh:
            self.queue.enqueue(line.strip())

def consumer(self):
    # Fire up N of these babies for some speed
    while True:
        url = self.queue.dequeue()
        dh = urllib2.urlopen(url)
        with fh = open('/dev/null', 'w'): # gotta put it somewhere
            fh.write(dh.read())

现在,如果您正在下载非常 的数据 block (数百 MB)并且单个请求完全使带宽饱和,那么是的,运行多个下载是没有意义的。您运行多个下载(通常)的原因是因为请求很小并且具有相对较高的延迟/开销。

关于python - 多处理对 urllib2 没用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6905800/

相关文章:

python - 选择要从 $lookup 返回的字段

Python 多处理 - 只是不明白

python-2.7 - python-boilerpipe 挂起多处理

python - 多处理 Pool.map 的奇怪行为

python - 如何强制 urllib2 超时?

python - sqlselect() 最多接受 2 个参数(给定 3 个)

Python 高阶函数

python - 类型错误 : 'module' object is not callable . MFCC

python - 如何将 Py3k HTTPResponse 转储到 json.load 中?

python - 使用 Python urllib2 将 zip 文件直接上传到 AWS S3