我目前通过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,但我不完全确定如何继续。
答案 0 :(得分:1)
你在这里所拥有的是,除非你打电话给API,否则你不会事先知道接下来会读到什么。想想这个,你能做什么并行?
我不知道你能做多少并行和哪些任务,但让我们试试......
一些假设: - 您可以从API检索数据而不受处罚或限制 - 一页/每批的数据处理可以独立完成
什么是缓慢的IO - 所以立即你可以将代码分成两个并行运行的任务 - 一个将读取数据,然后将其放入队列并继续读取,除非命中限制/空响应或如果队列已满则暂停
然后是第二个任务,即从队列中获取数据,并对数据执行某些操作
所以你可以从另一个
调用一个任务其他方法是您有一个任务,即在读取数据后立即调用其他任务,因此它们的执行将并行运行但稍有移动
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_page
和do_data_process
设置单独的队列
为什么这种方法,不是扭曲或异步?
因为你有cpu-bond数据处理(json,然后是数据),因此最好有单独的进程,芹菜是完美的。