2017-11-02 1 views
0

데이터베이스 테이블을 구성하는 샐러리 작업을 사용하여 장고 응용 프로그램을 만들었습니다. 샐러리 작업은 약 8 초 걸립니다. (매우 무거운 테이블 이동 및 1 백만 라인을 초과하는 조회)버튼 클릭시 셀러리 작업을 한 번만 수행하십시오.

이 셀러리는 등록 된 사용자가 버튼 클릭을 시작합니다.

나는 tasks.py와 urls.py에 별도의 task-url에서 작업보기를 만들었습니다. 이 task-url로 이동하면 작업이 시작됩니다.

내 문제 :

  1. 작업이 완료되지 않은 상태에서 작업-URL을 새로, 당신은 새 작업을 불. 이 셋업으로
  2. , 당신은 다른 페이지로 이동하거나보기 내가 새로 고침 각 시간을 발사에서 작업을 방지하고 다른 페이지로 이동 방지 할 방법

를 다시로드합니다. 이상적으로 사용자는이 특정 유형의 하나의 작업 만 실행할 수 있습니다.

JQuery/Ajax로이 작업을 수행 할 수 있습니까? 일부 영웅은 전문가가 아니기 때문에 JQuery/Ajax에 대한 경험이 없기 때문에 올바른 방향으로 나를 지적 할 수 있습니까? 이 클라이언트 측에서 수행해야하는 경우

감사

나는 그것이 잠금을 사용하여 서버 측에서 더 쉽게 할 수 있다고 생각

답변

1

"새로 고침 할 때마다 작업이 실행되지 않도록하려면 어떻게해야합니까?"

먼저 "POST"요청에서보기는 작업을 시작하는 "POST/redirect/GET"패턴을 사용해야합니다. (GET 요청 은 부작용이없는이어야 함) HttpResponseRedirect을 반환합니다.

이 여전히 실행되고있는 첫번째 동안 두 번째 작업을 발사에서 사용자를 막을 수 없습니다, 그러나 방지 않습니다 다시 제출 ...

페이지 ("GET") 형태를 새로 고칠 때마다

이상적으로 사용자는이 특정 유형의 작업 하나만 실행할 수 있습니다.

작업을 발사 할 때,이 세션에서 ID의 저장 및 발사 이전 작업이 작업 ID에 대한 세션을 확인하십시오. 있다면, 그것을 사용하여 작업의 상태를 확인하십시오. 완료되면 (결과가 무엇이든) 작업 id를 제거하고 새 작업을 계속 진행하십시오. 그렇지 않으면 사용자에게 이미 작업이 실행 중임을 알리는 메시지 만 표시됩니다.

세션에서 "고스트"task_id의 대소 문자를 올바르게 처리했는지 확인하십시오. 셀러리가 이미 결과를 무시한 것은 오랫동안 완료된 작업 일 수도 있고, 작업자 또는 브로커 충돌시 잃어버린 작업 일 수도 있습니다. 예, 쉬! ~ 일은 ~ 등). 실제 해결책은 실제로 (timestamp, task_id) 쌍을 저장하고 샐러리에 task_id가없는 상태 인 경우 - 실제로 "상태 없음"은 (잘못) celery.states.PENDING으로, "이 작업의 ATM에 대한 단서가 없습니다"라는 의미입니다. - 타임 스탬프를 확인하십시오. 그것이 오래되다면 아마 그걸 오래 죽은 것으로 생각할 수 있고 6 feets 미만일 수 있습니다.

다른 페이지로 이동하지 못하도록합니다.

왜 사용자가 실제로 그 동안 다른 작업을 수행하지 못하게 하시겠습니까? UI/UX 관점에서 작업이 시작되면 사용자는 진행률 막대 또는 유사한 피드백을 가능한 한 많이 가지고 "기다려주십시오"페이지로 리디렉션되어야합니다. 간단한 (무거운 경우) 해결책은 ajax를 사용하여 폴링을 수행하는 것입니다. task_id를 사용하고 결과/진행 상황을 확인한 다음 json으로 반환하는보기를 설정하고 '기다려주십시오'페이지에서이보기를 호출합니다 (아약스 사용).) X 초마다 자동으로 업데이트됩니다 (작업이 완료되면 사용자를 다음 페이지로 리디렉션 할 수도 있음).

이제 작업이 실행되는 동안 사용자가 수행 할 수없는 작업 (동일한 작업을 다시 실행하지 않고)이 있으면 해당 작업에 대해 동일한 "현재 작업에 대한 세션 검사"메커니즘을 사용할 수 있습니다. 뷰 데코레이터가 실제로 도움이 됨).

+0

안녕하세요, 저는 마침내 Ajax POST를 통해 views.py에 등록하는 버튼을 얻고 30 초 시간 제한의 캐시를 사용했습니다. 하나의 특정 세션 변수에 대한 특정 시간 초과가 발생하지 않습니다. 다른 페이지로 이동하는 것과 관련된 : 비슷한 html에 대한 특정 URL을 사용할 때만 관련이 있습니다. – radzia2

+0

잠시 동안 내 캐시에서 한 가지 추가 작업이 진행됩니다. 이것이 "worker"의 캐시이고 "web"프로세서의 캐시가 아니기 때문에 셀러리 작업에서 캐시를 지울 수 없습니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 아니면 뭔가 다른 캐시에 가서? – radzia2

+0

캐시를 무효화 할 때까지 캐시는 벌금입니다 (). 캐시 기반 솔루션을 사용한다면 Django와 Celery 프로세스 모두에서이 캐시에 액세스 할 수 있어야합니다. IOW를 사용하려면 분산 캐시를 사용해야합니다. 결과 Redend를 백엔드로 사용하고 있다면, 캐싱에 사용하십시오. 자세한 정보 없이는 더 많은 도움을 줄 수 없습니다 ... –

0

는이 질문 Running "unique" tasks with celery

를 참조 할 수 방법은 같은 쿠키를 설정하는 것 작업이 완료되면이

if (typeof $.cookie("running") === "undefined"){ 
    var date = new Date(); 
    var minutes = 20; 
    date.setTime(date.getTime() + (minutes * 60 * 1000)); 
    $.cookie("running", "true", { expires: date }); 
} 

및 삭제

관련 문제