我有一个表,我从中选择特定记录并更新它们。现在我想运行两个单独的程序来完成这项工作。
该表submission
存储了比赛的程序提交。它有一个属性status
,最初Queued
是,后来更改为Wrong Answer
,等等。所以Accepted
我的程序读取那些状态为的记录Queued
并评估它们。
现在,如果我在两个单独的终端上运行该程序,请说program_1 and program_2
. 如果program_1
读取带有Queued
状态的记录,那么我不想program_2
读取它,因为这意味着对提交的重新评估。这违背了我并行评估的目的。另外,如果我在读取的记录上加锁program_1
将解决问题。但是之后program_2
program_1
即使在评估提交时也可能必须等待锁被释放,并且在它释放后锁program_2
与此提交无关,因为它的状态将是其他的东西,Queued
因为它已经被评估了program_1
。这再次破坏了目的以某种方式进行并行评估。
我该如何解决这个问题?
问问题
60 次
1 回答
1
如果您只对恰好两个程序的解决方案感兴趣,那么您只需按主键对表进行排序,然后program_1
从列表顶部program_2
开始,从底部开始呢?这将您的重复工作限制为最多一个记录(两个程序的工作“在中间相遇”的记录)。如果一个程序仅在几条记录后就死掉了,那么另一个程序将能够完成工作。
(当然,如果一个程序仅在几条记录后就死掉了,那么很可能存在一个足够严重的错误,以至于另一个程序也会很快死掉。)
FWIW,我建议不要尝试这样做。让两个进程争夺一个未区分的工作负载绝不是一个好主意。如果要加快处理速度,请在一个线程上执行查询,然后将工作显式分配给其他几个线程。(您可以通过派生新进程而不是产生新线程来执行相同的方法;甚至可以通过对其他物理机器进行 RPC;但这对我来说确实有点矫枉过正。)
即,而不是
L = result_of_SQL_query();
worker1.process(L) & worker2.process(L);
你应该做
L = result_of_SQL_query();
L1 = first_half_of(L);
L2 = second_half_of(L);
worker1.process(L1) & worker2.process(L2);
如果您担心它worker1
可能会死掉,那么您将需要某种方式让父进程检测到一个孩子已经死去,查询其剩余的工作量,然后将该工作量重新分配给另一个孩子。
于 2013-06-27T20:39:47.037 回答