并行化循环以下载数据

时间:2016-07-01 22:41:21

标签: python

我是Python的新手。我想在Google App Engine中运行一个简单的脚本,尽可能快地将许多文件检索到对象中。并行化是一个明智的选择,我将如何去做?提前感谢您的头脑风暴

import requests

...
theData=[]
for q in range(0, len(theURLs)):

    r = requests.get(theURLs[q])
    theData.insert(q,r.text)

3 个答案:

答案 0 :(得分:3)

您应该使用列表推导使代码更加Pythonic:

# A list of tuples
theData = [(q,requests.get(theURLs[q]).text) for q in range(0, len(theURLs))]

# ... or ...

# A list of lists
theData = [[q,requests.get(theURLs[q]).text] for q in range(0, len(theURLs))]

如果你想同时检索文件使用threading库,这个网站有一些很好的例子,可能是一个很好的做法:

http://www.tutorialspoint.com/python/python_multithreading.htm

答案 1 :(得分:3)

在“常规”Python中,这非常简单。

from multiprocessing.pool import ThreadPool
import requests
responses = ThreadPool(10).map(requests.get, urls)

将10替换为可为您带来最佳效果的线程数。

但是你指定了GAE,它限制了生成线程/进程和它自己的异步方法,它包括使用URL Fetch service中的异步函数,这些内容沿着这些行(未经测试):

rpcs = [urlfetch.create_rpc() for url in urls]
for (rpc, url) in zip(rpcs, urls):
    urlfetch.make_fetch_call(rpc, url)
results = [rpc.get_result() for rpc in rpcs]

您需要添加错误处理...

答案 2 :(得分:-1)

我严重怀疑它。并行化实际上只能加速计算,而这里的瓶颈就是数据传输。