2017-12-14 10 views
0

API의 데이터에 액세스해야하는 프로그램이 있습니다. 목록을 가져와 그 목록의 모든 항목에 대해 API에서 더 많은 데이터를 요청해야합니다. 목록을 받으면이 목록에 약 600 개의 항목이있을 때 50 개의 배치로 가져옵니다. 요청 및 스레딩을 사용하여이 작업을 수행 할 수 있다고 생각했습니다.내 파이썬 스레드가 요청을 통해 서로 넘어지고 있습니까?

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() 

내가 모든 정보를 얻을 수있는 재귀 스레딩 기능을 가지고 : 나는 기본적으로 API를 호출하는 도우미 메서드를

:처럼 여기 보이는 것입니다.

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']) 

을하지만, 본질적으로 무엇에가는 것은 때때로 requests.get이 약간 왜곡 뭔가 반환하고 나는 JSONDecodeError 수 : 기대 값 : 1 행 1 (char 0).

첫 번째 요청이 정상적으로 처리되기 때문에 이것이 스레딩 문제인 것으로 의심됩니다. 나는 내가 잘못하고있는 것을 발견 할 수 없다.

+0

실제 URL은 무엇입니까? 쓰레드없이'get_item_info'를 시도 했습니까? 같은 문제가 생겼어? 당신이 얻은 것을보기 위해'response.text' 또는'response.content'를 출력 했습니까? 어쩌면 당신은 유용한 정보를 얻을 것입니다 - 아마 API가 당신에게 경고를 보내거나 네트워크에 다른 문제가 있습니다. 웹 브라우저에서 직접 테스트 할 수있는 전체 URL을 인쇄 했습니까? 어쩌면 당신도 웹 브라우저에서 작동하지 않는 URL을 만들 수 있습니다. – furas

+0

get_item_info는 스레드없이 완벽하게 작동합니다. 문제 없습니다. 나는 그 물품과 그 열쇠를 잘 인쇄했다. 전체 URL도 잘 작동합니다. 실제 URL은 무엇입니까? 그것은 회사의 클라우드 CRM입니다. –

답변

1

오케이. 죄송합니다 ... 제가 확인했지만 분명히 쿼리 제한에 도달했다고 생각했기 때문에 그것이 이상한 일을하기 시작했습니다.