我的Python线程是否因为请求而相互绊倒?

时间:2017-12-14 17:12:30

标签: python multithreading python-requests

我有一个需要从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)。

我非常怀疑这是一个线程问题,因为第一个请求通过就好了。我似乎无法找到我做错的事。

1 个答案:

答案 0 :(得分:1)

好。对不起......我以为我查了一下,但显然我达到了查询限制,这就是为什么它开始做奇怪的事情了。