【发布时间】:2013-04-30 08:14:26
【问题描述】:
我正在开发渲染农场,我需要我的客户能够启动渲染器的多个实例,而不会阻塞,以便客户端可以接收新命令。我的工作正常,但是在终止创建的进程时遇到问题。
在全局级别,我定义了我的池(以便我可以从任何函数访问它):
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 终止但后台进程仍在运行。谁能推荐一种更好的方法来控制这些已启动的程序?
【问题讨论】:
-
尝试使用
from multiprocessing import util; util.get_logger().setLevel(util.DEBUG)启用调试日志并粘贴输出。 -
我以前见过这样的行为,但现在无法重现......我想知道在调用 p.terminate() 之后调用 p.join() 是否会有所帮助?我还想知道您是否甚至需要调用终止,如果只是执行 sys.exit() 将正确地垃圾收集池及其所有进程。
-
当我尝试启用日志记录时,我在控制台中得到了这个:“找不到记录器“多处理”的处理程序。不幸的是,p.terminate() 之后的 p.join() 没有' t 有所作为,并且 sys.exit() 关闭 python 但让进程在后台运行。
-
试试
multiprocessing.log_to_stderr().setLevel(logging.DEBUG)。render()是否启动其他进程,例如使用subprocess模块?
标签: python multiprocessing python-multiprocessing pool