gpt4 book ai didi

python - 多处理对 urllib2 没用?

转载 作者:太空狗 更新时间:2023-10-29 20:11:39 26 4
gpt4 key购买 nike

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

你能用多处理加速 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com