微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

中断GNU并行后如何将KeyboardInterrupt提升为Python脚本?

如何解决中断GNU并行后如何将KeyboardInterrupt提升为Python脚本?

我正在使用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脚本的数据写入方法的答案。

解决方法

我相信您正在寻找--termseqmyprog.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程序由于某种原因而卡住,那只是一个回退。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。