algorithm - 我的流程/脚本如何避免陷入无限循环?

标签 algorithm perl loops process queue

为了清楚起见,我有一个简单的算法如下,省略了不相关的东西:

while( my $data = get_data() ) {  
   process($data);    
}  

sub get_data() {  
   return $dbh->execute("SELECT * FROM TABLE WHERE status = 'submitted'");  
}  

sub process {  
   my $data = shift;  
   foreach my $row (@$data) {  
      handle($row);  
   }  
}  

sub handle {  
   my $row = shift;  
   # process logic here  
   $dbh->execute("UPDATE TABLE SET status='done'" WHERE id = $row->id");   
}  

现在的问题是有一个导致无限循环的错误。如果在处理和核心处理逻辑期间出现故障并且代码无法更新为完成状态,那么在下一个循环中它将一遍又一遍地重试记录。
添加新状态我认为只是将同样的问题转移到其他地方,所以我认为我的逻辑存在某种缺陷。
有没有办法让进程“理解”它陷入了循环并且没有进展?或者按照@amit 改写:有没有办法避免无限循环?
我只能想出以下几点:
1) 当我执行 get_data() 时,我将行添加到内存数组中,因此在下一个循环中我将执行 SELECT * FROM TABLE WHERE status = 'submitted' WHERE id NOT IN (@数组)
这将有效,但对于大量记录,例如50000 将它们放在 IN 中似乎不切实际。
2)尝试查看更新了多少条记录。如果 sizeof($data) != number of updated records 这可能意味着卡在进程中。

这两种方法对我来说都不好。谁能帮我解决这个问题?

最佳答案

如果您不想使用内存数组(我不怪您),您是否可以修改现有表或创建另一个表?如果是这样,您可以将成功更新的记录移动到新表,即使它只有 2 列,然后:

sub get_data() {  
   return $dbh->execute("SELECT * FROM TABLE WHERE ID NOT IN (SELECT ID FROM NEW_TABLE)");  
}

在处理如此多的记录时很难在内存中维护哈希/数组,尤其是当您的应用程序由于某种原因崩溃时。至少这样你在进步。

我没有在编程逻辑中看到处理此问题的不同方式。

关于algorithm - 我的流程/脚本如何避免陷入无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22973224/

相关文章:

java - n个1位数字的加法器算法

perl - 如何使用 perl oneliner 遍历多个文件

Linux 脚本 : Using perl to insert record using If-Else condition

c - 确定质数或合数

Java:如何实现康威的生命游戏?

javascript - 如何解决可视化算法的问题

java - 如何从循环外部访问在嵌套循环中声明或初始化的数组或变量?

R,在循环中添加数据帧

c++ - 如何有效地计算第n个n位回文?

Perl JSON::RPC::Client Not a HASH reference 错误