Как (в коде) я могу запретить двум людям запускать одну и ту же задачу краудсорсинга одновременно? - PullRequest
0 голосов
/ 16 февраля 2011

Я пытаюсь создать приложение Django для задачи краудсорсинга перевода.

Для каждой задачи в базе данных у меня есть логический флаг is_completed, который устанавливается, когда пользователь завершает задачу.У меня также есть кнопка «дать мне случайную задачу», которая выбирает из списка незавершенных задач.

У меня такой вопрос.Как не дать двум пользователям выполнять одну и ту же задачу, если один пользователь нажимает кнопку вскоре после другой?

Я думал об установке флага has_started в строке при загрузке задачи и удалении запущеннойзадачи из списка случайных доступных задач: но что, если пользователь запускает задачу, а затем закрывает страницу, не завершив ее, чтобы она никогда не сбрасывалась?У меня будет много незавершенных задач.

Могу ли я пометить это более умным способом с переменными сеанса, которые истекают, возможно?Но я знаю, что трудно надежно зафиксировать событие «пользователь закрывает страницу» в JavaScript.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 16 февраля 2011

Я думаю, вам лучше установить идентификатор пользователя и начальную дату при запуске.

Когда вы обновляете базу данных следующим образом -

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

- вы заметите 0 измененных записей, когда задача уже назначена пользователю.Это решает вашу первую проблему.

Затем, когда вы сохраняете дату последнего изменения, вы можете запустить задание cron, чтобы очистить оставленные задания, будучи заданиями, которые не были изменены в течение определенного периода времени.Но это совсем другая проблема.Трудно найти правильный баланс для принятия слишком раннего или слишком позднего решения о том, отменена ли задача или нет.

Если каждая модификация также обновляет эту дату, пользователь может даже работать над задачей в течение более длительного времени, безэто было украдено кем-то еще, пока они регулярно сохраняют.Кроме того, при сохранении данных модификации (вы можете написать подпрограмму для этого), вы можете проверить, совпадает ли идентификатор пользователя.Если ИД пользователя задачи НЕДЕЙСТВИТЕЛЕН (cron решил «покинутый») или другой ИД пользователя (заброшенная задача была подхвачена кем-то другим), вы можете вызвать ошибку, чтобы сообщить пользователю, что задача больше не принадлежит ему.

0 голосов
/ 16 февраля 2011

Я бы использовал блокировку, вы добавляете поле «lock_time» в свою базу данных.Вы обновляете это до текущего времени, как только пользователь запускает задачу.Затем, с событием, которое вызывается каждые, скажем, 10 секунд в JavaScript, вы обновляете lock_time.Теперь вы можете проверить, было ли время блокировки более 30 секунд назад, если это так: вы «сломаете» блокировку.

0 голосов
/ 16 февраля 2011

Вам придется использовать тайм-аут.Нет никаких событий javascript для «пользователь разливает кофе на компьютер» или «пользователь делает полный сброс» и т. Д.

0 голосов
/ 16 февраля 2011

Вместо того, чтобы устанавливать флаг has_started, вы можете сделать его отметкой времени и выбрать разумное количество времени для завершения задачи (что позволит вам предположить, что задача была отброшена через X минут).* Существует риск того, что это приведет к нескольким переводам одной и той же вещи (т. Е. Если кто-то действительно очень медленный и работа будет рециркулирована рано), но я думаю, что это охватит большинство случаев.

...