异步循环通过分页api

时间:2016-06-10 22:13:35

标签: python api asynchronous pagination twisted

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

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,但我不完全确定如何继续。

1 个答案:

答案 0 :(得分:1)

你在这里所拥有的是,除非你打电话给API,否则你不会事先知道接下来会读到什么。想想这个,你能做什么并行?

我不知道你能做多少并行和哪些任务,但让我们试试......

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

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

然后是第二个任务,即从队列中获取数据,并对数据执行某些操作

所以你可以从另一个

调用一个任务

其他方法是您有一个任务,即在读取数据后立即调用其他任务,因此它们的执行将并行运行但稍有移动

我将如何实施它?作为celery任务和是requests

e.g。第二个:

@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_pagedo_data_process设置单独的队列

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

因为你有cpu-bond数据处理(json,然后是数据),因此最好有单独的进程,芹菜是完美的。

相关问题