中断 GNU Parallel 后如何将 KeyboardInterrupt 提高到 Python 脚本?

How to Raise KeyboardInterrupt to Python Scripts After Interrupting GNU Parallel?

我正在使用 GNU Parallel to 运行 一个 Python 脚本来获取不同参数的列表。在 Python 脚本中,我正在将数据写入文件(实际上,文件名就是脚本参数)。 Python 脚本在处​​理 N 次试验 后将数据写入文件 ,其中 N 是另一个参数。因此,在所有试验完成之前不会写入数据。但是通过试验的时间可能会因许多测试参数而异。出于这个原因,如果脚本对于特定参数集花费的时间太长,脚本允许我引发 KeyboardInterrupt 错误 (Ctrl+C) 并在终止之前写入到目前为止获得的数据。

但是,通过使用 GNU Parallel,使用 Ctrl+C 将终止并行命令,并完全停止 Python 作业,因此到目前为止没有数据被写入。

是否可以在这些 Python 脚本中引发 KeyboardInterrupt 以让它们在并行被终止之前完成错误处理?理想情况下,它会像 1. 执行 parallel python script.py ::: args,2. 一段时间后,使用 Ctrl+C 取消,3. Parallel 告诉 Python 脚本查看 KeyboardInterrupt(或任何错误,它没关系)并且并行暂停等待 Python 个作业完成处理,4. 并行终止,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 到 child,等待 2000 毫秒,如果 child还活着杀了child.

稍等几秒后按ctrl-c

如果您完全确定 Python 程序会在收到 SIGTERM 后退出,那么您可以删除 ,KILL,20。如果 Python 程序由于某种原因卡住,这只是一个回退。