gpt4 book ai didi

python - 异步循环遍历分页 api

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:50 30 4
gpt4 key购买 nike

我目前正在通过一个 API 获取数据,该 API 以分页方式返回近 100,000 个文档(每页 100 个)。我目前有一些代码,大致功能如下:

while c <= limit:
if not api_url:
break

req = urllib2.Request(api_url)
opener = urllib2.build_opener()
f = opener.open(req)
response = simplejson.load(f)

for item in response['documents']:
# DO SOMETHING HERE
if 'more_url' in response:
api_url = response['more_url']
else:
api_url = None
break
c += 1

以这种方式下载数据真的很慢,我想知道是否有任何方法可以异步方式循环访问页面。我被推荐看一下 twisted ,但我不完全确定如何继续。

最佳答案

这里的情况是,除非您调用 API,否则您事先不知道接下来将读取什么。想一想,您可以并行做什么?

我不知道您可以并行执行多少任务以及哪些任务,但让我们试试...

一些假设:- 您可以不受惩罚或限制地从 API 检索数据- 一页/一批的数据处理可以独立完成

缓慢的是 IO - 所以您可以立即将代码拆分为两个并行运行的任务 - 一个将读取数据,然后将其放入队列并继续读取,除非达到限制/空响应或如果队列已满则暂停

然后是第二个任务,即从队列中取出数据,并用数据做一些事情

这样你就可以从另一个任务中调用一个任务

另一种方法是你有一个任务,即在读取数据后立即调用另一个任务,因此它们的执行将并行运行但略有偏移

我将如何实现?作为celery任务,是 requests

例如第二个:

@task
def do_data_process(data):
# do something with data
pass

@task
def parse_one_page(url):
response = requests.get(url)
data = response.json()

if 'more_url' in data:
parse_one_page.delay(data['more_url'])

# and here do data processing in this task
do_data_process(data)
# or call worker and try to do this in other process
# do_data_process.delay(data)

如果您要对代码添加限制,则由您决定并行运行多少个任务,您甚至可以在多台机器上拥有工作人员,并为 parse_one_page 设置单独的队列>做数据处理

为什么采用这种方法,而不是扭曲或异步?

因为你有 cpu-bond 数据处理(json,然后是数据),因此最好有单独的进程,celery 非常适合它们。

关于python - 异步循环遍历分页 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757839/

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