问题描述
我正在使用GNU Parallel运行Python脚本以获取不同参数的列表。在Python脚本内部,我正在将数据写入文件(实际上,文件名是script参数)。 Python脚本在处理N次试验后将数据写入文件 ,其中N是另一个参数。因此,直到所有试验完成,才写入数据。但是,进行测试的时间可能会因测试参数的不同而有所不同。因此,如果脚本对于某些参数集花费的时间太长,该脚本使我可以引发KeyboardInterrupt错误(Ctrl + C)并写入迄今为止获得的数据,然后终止。
但是,通过使用GNU Parallel,使用Ctrl + C将终止并行命令,并完全停止Python作业,因此至今未写入任何数据。
是否可以在这些Python脚本中引发KeyboardInterrupt,以使它们在杀死并行之前完成对错误的处理?理想情况下,它将类似于1.执行parallel python script.py ::: args
,2.经过一段时间,使用Ctrl + C取消,3.并行告诉Python脚本看到KeyboardInterrupt(或任何错误,都没有关系),然后Parallel暂停以等待Python作业完成处理; 4。Parallel终止; 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 Parallel收到 ctrl-c 时,它将向孩子发送SIGTERM
,请等待2000 ms,如果孩子还活着,请杀死孩子。
等待几秒钟,然后按 ctrl-c
如果您完全确定Python程序会在收到SIGTERM
后退出,那么您可以删除,20
。如果Python程序由于某种原因而卡住,那只是一个回退。