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
.
,否则您将看不到输出
我正在尝试 运行 与 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
.