2011-02-15 7 views
0

번역 crowdsourcing 작업을위한 장고 응용 프로그램을 만들려고합니다.두 사람이 같은 crowdsourcing 작업을 동시에 시작하는 것을 방지하려면 어떻게해야합니까?

데이터베이스의 각 작업에 대해 사용자가 작업을 완료 할 때 설정되는 is_completed 부울 플래그가 있습니다. 나는 또한 '나에게 무작위 작업'버튼을 제공하는데,이 버튼은 완료되지 않은 작업 목록에서 선택합니다.

내 질문은 여기 있습니다. 한 사용자가 곧 다른 버튼을 클릭하면 두 명의 사용자가 동일한 작업을 수행하지 못하게하려면 어떻게합니까?

작업이로드 될 때 행에 has_started 플래그를 설정하고 임의의 사용 가능한 작업 목록에서 시작된 작업을 제거하려고합니다. 사용자가 작업을 시작한 다음 페이지를 닫지 않고 닫으면, 그래서 결코 설정되지 않았습니까? 나는 많은 미완성 과제로 끝날 것입니다.

만료되는 세션 변수를 사용하여 좀 더 똑똑하게 표시 할 수 있습니까? 하지만 JavaScript에서 '사용자 닫기 페이지'이벤트를 안정적으로 캡처하는 것이 어렵다는 것을 알고 있습니다.

감사합니다.

+0

안녕하세요, 저는 [crowdsourcing 프로젝트] (http : // stackoverflow.com/questions/11693831/django-crowdsourcing-project) 장고 크롤링 응용 프로그램 중 하나를 사용했거나 자신을 만들었는지에 관심이 있습니까? –

답변

0

플래그를 has_started로 만드는 대신 시간 소인으로 만들고 작업 완료에 알맞은 시간을 결정할 수 있습니다. 이렇게하면 작업이 X 분 후에 삭제되었다고 가정 할 수 있습니다.

동일한 결과가 여러 번 번역 될 수 있습니다 (즉, 누군가가 실제로 느리고 작업이 일찍 재순환되는 경우).하지만 대부분의 경우에 해당됩니다.

0

나는 잠금을 사용할 것이고, 데이터베이스에 "lock_time"필드를 추가한다. 사용자가 작업을 시작하자마자 현재 시간으로 업데이트합니다. 그런 다음 모든 사람에게 호출되는 이벤트가 있다고 가정 해 봅시다. 자바 스크립트에서 10 초, lock_time을 업데이트합니다. 이제 lock_time이 30 초 전인지 여부를 확인할 수 있습니다. 그렇다면 잠금을 "중단"합니다.

0

시간 제한을 사용해야합니다. "컴퓨터에 사용자 유출 커피"또는 "사용자가 하드 재설정을 수행합니다."에 대한 javascript 이벤트가 없습니다.

0

시작시 사용자 ID와 시작일을 설정하는 것이 가장 좋을 것 같아요.

때 데이터베이스 같은 업데이트 -

UPDATE task t 
SET t.userid = :USERID, t.lastprogress = sysdate() 
WHERE t.userid is null and t.taskid = :TASKID 

- 작업이 이미 사용자에게 할당 할 때 0 수정 기록을 알 수 있습니다. 이것은 귀하의 첫 번째 문제를 해결합니다.

그런 다음 마지막으로 수정 한 날짜를 저장하면 cron 작업을 실행하여 특정 기간 동안 수정되지 않은 작업 인 버려진 작업을 정리할 수 있습니다. 그러나 이것은 전혀 다른 문제입니다. 작업을 포기한 것인지 아닌지를 너무 일찍 결정하거나 너무 늦게 결정하는 것이 적절한 균형을 찾는 것은 어렵습니다.

모든 수정 작업도이 날짜를 업데이트하면 사용자는 정규 저장을하는 한 다른 사람이 도난 당하지 않고 더 긴 시간 동안 작업 할 수 있습니다. 또한 수정 데이터를 저장할 때 (이를 수행하는 루틴을 작성할 수 있음) 사용자 ID가 여전히 일치하는지 확인할 수 있습니다. 작업의 사용자 ID가 NULL (cron이 '취소됨')이거나 다른 사용자 ID (다른 사용자가 포기한 작업) 인 경우 오류가 발생하여 사용자가 더 이상 작업에 속하지 않음을 알릴 수 있습니다.

관련 문제