我正在尝试为翻译众包任务构建一个Django应用程序。
对于数据库中的每个任务,我有一个is_completed
布尔标志,在用户完成任务时设置。我还有一个“给我一个随机任务”按钮,从未完成的任务列表中选择。
我的问题是这个。如果一个用户一个接一个地点击该按钮,我如何防止两个用户被赋予相同的任务?
我在考虑在加载任务时在行上设置has_started
标志,并从随机可用任务列表中删除已启动的任务:但如果用户启动任务然后关闭页面,该怎么办?完成它,所以它永远不会被取消?我最终会完成许多未完成的任务。
我可以用一种更聪明的方式标记这个,会话变量可能会过期吗?但我知道很难在JavaScript中可靠地捕获“用户关闭页面”事件。
谢谢!
答案 0 :(得分:0)
不是让has_started标志,而是让它成为一个时间戳并决定合理的任务完成时间(这将允许你假设任务在X分钟后被删除)。
这可能导致同一事物的多次翻译(即如果有人真的很慢并且工作提前再循环),但我认为它将涵盖大多数情况。
答案 1 :(得分:0)
我会使用锁定,在数据库中添加一个字段“lock_time”。您可以在用户启动任务后立即将其更新为当前时间。然后,对于一个名为every的事件,让我们说:在javascript中10秒,你更新lock_time。现在你可以检查lock_time是否超过30秒,如果是这样的话:你“破解”了锁。
答案 2 :(得分:0)
你必须使用超时。 “用户在计算机上溢出咖啡”或“用户进行硬重置”等没有javascript事件。
答案 3 :(得分:0)
我认为你最好在开始时设置用户标识和开始日期。
更新像这样的数据库时 -
UPDATE task t
SET t.userid = :USERID, t.lastprogress = sysdate()
WHERE t.userid is null and t.taskid = :TASKID
- 当任务已分配给用户时,您将注意到0个已修改的记录。这解决了您的第一个问题。
然后,当您保存上次修改日期时,您可以运行cron作业来清理已放弃的任务,这是在特定时间段内未被修改的任务。但这完全是一个不同的问题。无论任务是否被放弃,都很难找到过早或过晚决定的正确平衡。
如果每次修改都会更新此日期,则用户甚至可以更长时间地处理任务,而不会被其他人窃取,只要他们进行常规保存即可。 此外,在保存修改数据时(您可以编写例程来执行此操作),您可以检查用户标识是否仍然匹配。如果任务的用户标识为NULL(cron决定'放弃')或另一个用户标识(被其他人选择放弃的任务),则可以引发错误以告知用户该任务不再属于他们。