我正在使用GNU并行程序为不同的参数列表运行Python脚本。在Python脚本中,我将数据写入一个文件(事实上,文件的名称就是脚本参数(。Python脚本在处理N个试验后将数据写入文件,其中N是另一个参数。因此,在所有试验完成之前,数据不会被写入。但进行审判的时间可能因测试论点的数量而异。因此,如果脚本对某组参数花费的时间太长,脚本允许我引发KeyboardInterrupt错误(Ctrl+C(,并在终止之前写入迄今为止获得的数据。
然而,通过使用GNU并行,使用Ctrl+C将终止并行命令,并完全停止Python作业,因此到目前为止还没有写入任何数据。
有可能在这些Python脚本中引发KeyboardInterrupt,让它们在并行被终止之前完成错误处理吗?理想情况下,它会变成1。执行parallel python script.py ::: args
,2。一段时间后,使用Ctrl+C取消,3。Parallel命令Python脚本查看KeyboardInterrupt(或任何错误,都无关紧要(,Parallel暂停以等待Python作业完成处理,4。并行终止,5。我有当时获得的数据文件。
注意:我想要一个不要求重写Python脚本的数据编写方法的答案。
我相信您正在寻找--termseq
。myprog.pl
:
#!/usr/bin/perl
$SIG{'TERM'} = sub { print "TERM received. Flush files.n"; sleep(1); };
sleep(100);
现在运行:
parallel --termseq TERM,2000,KILL,20 -u ./myprog.pl ::: 1 2 3
当GNU并行程序接收到ctrl-c时,它将向子进程发送SIGTERM
,等待2000毫秒,如果子进程还活着,则杀死该子进程。
等待几秒钟,然后按ctrl-c
如果您绝对确定Python程序将在收到SIGTERM
后退出,那么您可以删除,KILL,20
。如果Python程序由于某种原因被卡住,这只是一种倒退。