Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何(在代码中)防止两个人同时启动同一个众包任务?_Django_Database Design_Crowdsourcing - Fatal编程技术网

Django 如何(在代码中)防止两个人同时启动同一个众包任务?

Django 如何(在代码中)防止两个人同时启动同一个众包任务?,django,database-design,crowdsourcing,Django,Database Design,Crowdsourcing,我正在尝试为翻译众包任务构建一个Django应用程序 对于数据库中的每个任务,我都有一个is_completedboolean标志,该标志在用户完成任务时设置。我还有一个“给我一个随机任务”按钮,从未完成任务列表中进行选择 我的问题是。如果一个用户紧接着另一个用户单击按钮,如何防止两个用户被赋予相同的任务 我想在加载任务时在行上设置一个has_start标志,并从随机可用任务列表中删除已启动的任务:但是如果用户启动一个任务,然后在没有完成它的情况下关闭页面,这样它就永远不会被取消设置,该怎么办?

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

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

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

我想在加载任务时在行上设置一个
has_start
标志,并从随机可用任务列表中删除已启动的任务:但是如果用户启动一个任务,然后在没有完成它的情况下关闭页面,这样它就永远不会被取消设置,该怎么办?我会有很多未完成的任务

我是否可以用一种更聪明的方式来标记过期的会话变量?但我知道很难用JavaScript可靠地捕获“用户关闭页面”事件


谢谢

不必设置has_start标志,您可以将其设置为时间戳,并确定任务完成的合理时间(这将允许您假设任务在X分钟后被丢弃)


这可能会导致同一事物的多个翻译(即,如果某人的速度非常慢,并且作业提前循环),但我认为这将涵盖大多数情况。

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

您必须使用超时。“用户在计算机上洒咖啡”或“用户硬重置”等没有javascript事件。

我认为最好在开始时设置用户ID和开始日期

当您像这样更新数据库时--

--当任务已分配给用户时,您将注意到0条已修改的记录。这解决了您的第一个问题

然后,在保存上次修改的日期时,可以运行cron作业来清理已放弃的任务,这些任务是在一定时间段内未修改的任务。但这是一个完全不同的问题。很难在过早或过晚决定是否放弃某项任务之间找到正确的平衡

如果每次修改都会更新此日期,用户甚至可以在任务上工作更长的时间,而不会被其他人窃取,只要他们定期保存。 此外,在保存修改数据时(您可以编写一个例程来执行此操作),您可以检查userid是否仍然匹配。如果任务的userid为NULL(cron判定为“已放弃”)或另一个userid(被其他人拾取的已放弃任务),您可以引发错误,告诉用户该任务不再属于他们。

Hi,我刚刚启动了一个,我想知道您是否使用了任何django crowsourcing应用程序或创建了自己的应用程序?
UPDATE task t 
SET t.userid = :USERID, t.lastprogress = sysdate() 
WHERE t.userid is null and t.taskid = :TASKID