我试图用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发布于 2021-09-03 11:12:58
GNU并行终止--termseq中指定的作业。默认为:
TERM,200,TERM,100,TERM,50,KILL,25SIGTERM,等待200毫秒,SIGTERM,等待100毫秒,SIGTERM,等待50毫秒,SIGKILL,等待25毫秒。如果进程在等待期间死亡,GNU并行将忽略序列的其余部分-不需要杀死一匹死马。
将--termseq更改为您要发送的信号以及它们之间的时间间隔。
CTRL-C发送SIGINT,因此这应该是有效的:
# Give 1 second to clean up, then kill
parallel --termseq INT,1000,KILL,25 ...请注意,除非使用--ungroup,否则您将看不到输出。
https://stackoverflow.com/questions/69025283
复制相似问题