2017-01-26 1 views
0

내 Django 앱에서 재 게시 엔드 포인트에 도달 한 후 해당 기능이 해당 상태를 확인하기 위해 트리거되는 작업 (다시 게시 작업)에 의해 트리거되는 함수가 있습니다. 다른 API 호출을 통해 30 분. 그 기능은 다음과 같습니다 :django에서 30 분 API 호출을 실행하는 방법

timeout = time.time() + 60 * 30 
     published_flag = False 
    while time.time() < timeout: 
       data = requests.get(apiUrl + dist_id).json() 
       try: 
        published_flag = data['flags'] 
        if published_flag: 
         break 
        else: 
         time.sleep(5) 
         continue 
       except KeyError: 
        break 

이 제한 시간은 30 분이며 매우 길다. 그러나 플래그 상태가 바뀌면 최악의 시나리오가 30 분입니다. 이 작업은 여러 번 트리거 될 수 있습니다 (여러 다시 게시 단추를 누를 수 있음). 엔드 포인트가 본질적으로 시간 초과되면 30 분이 너무 길어서 엔드 포인트가 작동하지 않습니다. 따라서 웹 소켓을 통해 프론트 엔드로 데이터를 전달합니다.

더 똑똑한 방법이 있나요?

+1

나는 느린 작업을 백그라운드에서 실행하기 위해'셀러리'http://www.celeryproject.org를 사용할 수 있다고 생각합니다. 작업이 완료되면 웹 소켓 연결을 유지하여 클라이언트에 알립니다. – Enix

+0

그러나 한 번에 6-7 개의 재 게시 작업이있을 수 있습니다. 그래서 그것들 각각에 대해, 제가 노동자의 수를 늘릴 수 있습니까? – foxtrot3009

+0

예, 원인이 있습니다. 'celery' 자습서를 볼 수 있습니다 http://docs.celeryproject.org/ko/latest/userguide/workers.html#starting-the-worker – Enix

답변

0

Enix가 쓴대로 Celery를 사용해야합니다. 그러나 당신은 많은 노동자들을 필요로하지 않습니다. 샐러리 작업 내에서 실제로는 sleep으로 전화하지 마십시오. 나중에 다시 시도 할 수 있습니다. 따라서 모든 작업이 매우 짧을뿐 아니라 1-2 명의 직원이 필요합니다.

@app.task(bind=True, max_retries=60*30/5) 
def do_whatever(self, dist_id): 
    data = requests.get(apiUrl + dist_id).json() 
    if 'flags' not in data: 
     self.retry(countdown=5) 
관련 문제