GNU 并行和 Python atexit

GNU Parallel and Python atexit

我正在尝试 运行 与 GNU 并行的 python 脚本。除了 python 脚本中使用的 atexit 例程外,一切似乎都正常。看起来,在 ctrl+c 之后,parallel 正在杀死 python 进程,而不给 python 一个调用已注册的 atexit 例程的机会。 如何使子进程的并行更好一点?

这是一个展示行为的例子。

test_signal.py:

#!/usr/bin/env python3

import time
import sys
import atexit

def cleanup():
    print('cleanup called', flush=True)

atexit.register(cleanup)

time.sleep(60)
print('completed process', sys.argv[1])

使用命令测试:

chmod +x test_signal.py
./test_signal.py 1 # this works as expected when using ^C
parallel -j 4 ./test_signal.py {} ::: $(seq 1 12) # this one does not

GNU Parallel 会终止 --termseq 中指定的作业。默认为:

TERM,200,TERM,100,TERM,50,KILL,25

所以 SIGTERM,等待 200 毫秒,SIGTERM,等待 100 毫秒,SIGTERM,等待 50 毫秒,SIGKILL,等待 25 毫秒。如果进程在等待时死亡,GNU Parallel 将忽略序列的其余部分 - 无需杀死死马。

--termseq 更改为您要发送的信号以及它们之间的时间。

CTRL-C 发送 SIGINT,所以这应该有效:

# Give 1 second to clean up, then kill
parallel --termseq INT,1000,KILL,25 ...

请注意,除非使用 --ungroup.

,否则您将看不到输出