"새로 고침 할 때마다 작업이 실행되지 않도록하려면 어떻게해야합니까?"
먼저 "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 초마다 자동으로 업데이트됩니다 (작업이 완료되면 사용자를 다음 페이지로 리디렉션 할 수도 있음).
이제 작업이 실행되는 동안 사용자가 수행 할 수없는 작업 (동일한 작업을 다시 실행하지 않고)이 있으면 해당 작업에 대해 동일한 "현재 작업에 대한 세션 검사"메커니즘을 사용할 수 있습니다. 뷰 데코레이터가 실제로 도움이 됨).
안녕하세요, 저는 마침내 Ajax POST를 통해 views.py에 등록하는 버튼을 얻고 30 초 시간 제한의 캐시를 사용했습니다. 하나의 특정 세션 변수에 대한 특정 시간 초과가 발생하지 않습니다. 다른 페이지로 이동하는 것과 관련된 : 비슷한 html에 대한 특정 URL을 사용할 때만 관련이 있습니다. – radzia2
잠시 동안 내 캐시에서 한 가지 추가 작업이 진행됩니다. 이것이 "worker"의 캐시이고 "web"프로세서의 캐시가 아니기 때문에 셀러리 작업에서 캐시를 지울 수 없습니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 아니면 뭔가 다른 캐시에 가서? – radzia2
캐시를 무효화 할 때까지 캐시는 벌금입니다 (). 캐시 기반 솔루션을 사용한다면 Django와 Celery 프로세스 모두에서이 캐시에 액세스 할 수 있어야합니다. IOW를 사용하려면 분산 캐시를 사용해야합니다. 결과 Redend를 백엔드로 사용하고 있다면, 캐싱에 사용하십시오. 자세한 정보 없이는 더 많은 도움을 줄 수 없습니다 ... –