【问题标题】:How to Raise KeyboardInterrupt to Python Scripts After Interrupting GNU Parallel?中断 GNU Parallel 后如何将 KeyboardInterrupt 提升到 Python 脚本?
【发布时间】:2021-01-01 00:46:10
【问题描述】:

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

【问题讨论】:

    标签: python bash interrupt-handling gnu-parallel raise


    【解决方案1】:

    我相信您正在寻找--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 毫秒,如果孩子还活着,就杀死孩子。

    等待几秒钟,然后按 ctrl-c

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

    【讨论】:

    • 太棒了! --termseq 正是我所需要的。但是,我发现SIGTERM 不起作用。但是在查看了其他终止信号之后,使用SIGINT 似乎完全符合我的要求。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多