0

我正在尝试为翻译众包任务构建一个 Django 应用程序。

对于数据库中的每个任务,我都有一个is_completed在用户完成任务时设置的布尔标志。我还有一个“给我一个随机任务”按钮,它可以从未完成的任务列表中选择。

我的问题是这个。如果一个用户紧接着另一个用户单击按钮,我如何防止两个用户被赋予相同的任务?

我正在考虑has_started在加载任务时在行上设置一个标志,并从随机可用任务列表中删除已启动的任务:但是如果用户启动任务然后关闭页面而不完成它怎么办,所以它永远不会被取消设置? 我最终会完成很多未完成的任务。

我可以用过期的会话变量以更聪明的方式标记它吗?但我知道很难在 JavaScript 中可靠地捕获“用户关闭页面”事件。

谢谢!

4

4 回答 4

0

除了将 has_started 设置为标志之外,您还可以将其设置为时间戳并决定任务完成的合理时间(这将允许您假设任务在 X 分钟后已被删除)。

这可能会导致同一事物的多次翻译(即,如果某人真的很慢并且工作很早就重新循环),但我认为它会涵盖大多数情况。

于 2011-02-15T22:51:20.873 回答
0

我会使用锁定,您在数据库中添加一个字段“lock_time”。一旦用户开始任务,您就将其更新为当前时间。然后,使用每调用一次的事件,假设:javascript 中的 10 秒,您更新 lock_time。现在您可以检查 lock_time 是否超过 30 秒,如果是:您“打破”了锁。

于 2011-02-15T22:53:18.737 回答
0

您将不得不使用超时。“用户将咖啡洒在计算机上”或“用户进行硬重置”等没有 javascript 事件。

于 2011-02-15T22:54:17.763 回答
0

我认为您最好在开始时设置用户标识和开始日期。

当你像这样更新数据库时——

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(被其他人捡起的已放弃任务),您可以引发错误以告诉用户该任务不再属于他们。

于 2011-02-15T22:55:35.010 回答