gpt4 book ai didi

python - 如何并行并发 HTTP 请求

转载 作者:行者123 更新时间:2023-11-28 19:21:22 26 4
gpt4 key购买 nike

我有一个包含 100 个 ID 的列表,我需要对它们中的每一个进行查找。查找大约需要 3 秒才能运行。这是运行它所需的顺序代码:

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(两者都不太熟悉)。

依次执行 100 个 ID 需要 364 秒。

在 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/

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