如何限制 Perl 脚本特定部分所花费的时间?
有没有什么方法可以构建一些时间计数器,使脚本的某些部分能够在滴答作响时运行? 例如,我有以下代码:
for my $i (0 .. $QUOTA-1) {
build_dyna_file($i);
comp_simu_exe;
bin2txt2errormap($i);
}
理论上我想运行这个循环3分钟,即使循环指令还没有完成,它仍然应该在正好3分钟后跳出循环。
实际上,该程序打开一个时间计数器窗口,该窗口与脚本的一部分并行工作(每次我调用它时)。
此外,子调用“comp_simu_exe”运行一个外部模拟器(在 shell 中),当超时结束时,该进程也必须被终止(假设一段时间后不会返回)。
sub comp_simu_exe{
system("simulator --shell");
}
死机问题与系统函数调用之间有什么联系吗?
Is there any way to build some time counter that enable parts of a script to run as long it ticks? For example, I have the following code:
for my $i (0 .. $QUOTA-1) {
build_dyna_file($i);
comp_simu_exe;
bin2txt2errormap($i);
}
Theoretically I want to run this loop for 3 minutes, even if the loop instructions haven't finished yet, it should still break out of the loop after exactly 3 minutes.
Actually the program opens a time counter window that works in parallel to part of the script (each time I call it).
Additionally, the sub call 'comp_simu_exe' run an outside simulator (in the shell) that when time out ends - this process must also killed (not suppose to return after a while).
sub comp_simu_exe{
system("simulator --shell");
}
Is there any connection between the dead coming problem to the system function call ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以设置一个警报,该警报将在指定的秒数后中断您的代码:
或者,如果您确实需要循环运行至少三次,无论这可能需要多长时间:
You can set an alarm that will break out of your code after a specified amount of seconds:
Or, if you really need the loop to run at least three times, no matter how long this might take:
这是第二个答案,涉及第二个进程超时的情况。 使用此案例启动您的外部程序并确保它不会花费太长时间:
Here's a second answer that deals with the case of timing-out a second process. Use this case to start your external program and make sure that it doesn't take too long:
在 Perl 中处理此类超时的方式是
alarm
函数。 在您传递到进程的秒数后,它将向您的进程发送信号ALRM
。 如果您尝试为调用sleep
设置超时的代码,请务必小心,因为它们在许多平台上不能很好地混合。 基本结构如下:或者写得更紧凑:
The way you deal with timeouts like this in Perl is the
alarm
function. It will send the signalALRM
to your process after the number of seconds you pass into it. Be careful if the code you are trying to setup the timeout for callssleep
, as they do not mix well on many platforms. The basic structure looks like this:or written more compactly: