我有一个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/

10-12 00:32
查看更多