我有一个100个ID的列表,我需要对每个ID进行查找。查找需要大约3s来运行。下面是运行它所需的顺序代码:
ids = [102225077, 102225085, 102225090, 102225097, 102225105, ...]
for id in ids:
run_updates(id)
我想使用gevent或多处理器一次同时运行其中的十(10)个。我该怎么做?这是我为gevent做的尝试,但很慢:
def chunks(l, n):
""" Yield successive n-sized chunks from l.
"""
for i in xrange(0, len(l), n):
yield l[i:i+n]
ids = [102225077, 102225085, 102225090, 102225097, 102225105, ...]
if __name__ == '__main__':
for list_of_ids in list(chunks(ids, 10)):
jobs = [gevent.spawn(run_updates(id)) for id in list_of_ids]
gevent.joinall(jobs, timeout=200)
如何正确地分割id列表并一次运行10个?我甚至愿意使用多处理器或gevent(两者都不太熟悉)。
按顺序操作需要364秒才能获得100个ID。
在100个ID上使用多处理器大约需要207秒,一次执行5次:
pool = Pool(processes=5)
pool.map(run_updates, list_of_apple_ids)
使用gevent需要介于两者之间:
jobs = [gevent.spawn(run_updates, apple_id) for apple_id in list_of_apple_ids]
有没有比Pool.map更好的性能?我这里有一台相当不错的电脑,有一个快速的互联网连接,它应该可以做得更快。。。
最佳答案
查看grequests库。你可以这样做:
import grequests
for list_of_ids in list(chunks(ids, 10)):
urls = [''.join(('http://www.example.com/id?=', id)) for id in list_of_ids]
requests = (grequests.get(url) for url in urls)
responses = grequests.map(requests)
for response in responses:
print response.content
我知道这在一定程度上破坏了您的模型,因为您的请求封装在一个
run_updates
方法中,但是我认为这可能还是值得探索的。关于python - 如何执行并行并发HTTP请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24253492/