gpt4 book ai didi

python - 如何终止多处理池进程?

转载 作者:太空狗 更新时间:2023-10-29 18:32:57 25 4
gpt4 key购买 nike

我在渲染农场工作,我需要我的客户能够启动渲染器的多个实例,而不会阻塞,以便客户端可以接收新命令。我的工作正常,但是我在终止创建的进程时遇到了问题。

在全局级别,我定义了我的池(以便我可以从任何函数访问它):

p = Pool(2)

然后我用 apply_async 调用我的渲染器:

for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()

该函数完成,在后台启动进程,并等待新命令。我做了一个简单的命令来终止客户端并停止渲染:

def close():
'''
close this client instance
'''
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()

它似乎没有给出错误(它会打印错误),python 终止但后台进程仍在运行。谁能推荐一种更好的方法来控制这些已启动的程序?

最佳答案

我找到了解决方案:在单独的线程中停止池,如下所示:

def close_pool():
global pool
pool.close()
pool.terminate()
pool.join()

def term(*args,**kwargs):
sys.stderr.write('\nStopping...')
# httpd.shutdown()
stophttp = threading.Thread(target=httpd.shutdown)
stophttp.start()
stoppool=threading.Thread(target=close_pool)
stoppool.daemon=True
stoppool.start()


signal.signal(signal.SIGTERM, term)
signal.signal(signal.SIGINT, term)
signal.signal(signal.SIGQUIT, term)

工作正常,我一直在测试。

signal.SIGINT

从键盘中断 (CTRL + C)。默认操作是引发 KeyboardInterrupt。

signal.SIGKILL

杀死信号。它不能被捕获、阻止或忽略。

signal.SIGTERM

终止信号。

signal.SIGQUIT

退出核心转储。

关于python - 如何终止多处理池进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com