我有一个需要从API访问数据的程序。我需要从中获取一个列表,然后针对该列表中的每个项目,从API请求更多数据。当我得到一个清单时,我会在50个批次中获得它们,此列表中有大约600个项目。我以为我可以使用请求和线程来做到这一点。这是它的样子:
我基本上有一个帮助方法来调用API:
call_api_method(method, token, params={}):
params_to_send = params.copy()
params_to_send['auth'] = token
response = requests.get('{0}/rest{1}'.format(DOMAIN, method), params = params_to_send)
return response.json()
然后我有一个递归线程函数来获取所有信息。我以为我可以使用线程继续请求下一批信息,同时让线程请求每个项目的信息:
def import_item_info(auth_token, start = None):
if start is None:
start = 0
threads = []
result = call_api_method('get_list', auth_token, {'start': start})
#the call returns next which is the index of the next batch
if result['next']:
thread = threading.Thread(target=import_item_info, args=(auth_token, result['next'])
thread.start()
threads.append(thread)
for list_item in result['result']:
thread = threading.Thread(target=get_item_info, args=(auth_token, item['ID'])
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
这是get_item_info,它使用项目的ID调用api以获取有关该项目的具体详细信息:
def get_item_info(auth_token, item_id):
item = call_api_method('get_item', auth_token, {'id': item_id})
print(item['key'])
我已经抽象了很多信息,但实际上发生的事情是,有时request.get返回一些稍微乱码的东西,我得到一个JSONDecodeError:期望值:第1行第1列(char 0)。
我非常怀疑这是一个线程问题,因为第一个请求通过就好了。我似乎无法找到我做错的事。
答案 0 :(得分:1)
好。对不起......我以为我查了一下,但显然我达到了查询限制,这就是为什么它开始做奇怪的事情了。