【发布时间】:2012-11-08 22:30:05
【问题描述】:
我正在向集群上的队列提交作业,并想检查作业是否已完成。我这样做的方法是查看列出当前正在运行的所有作业的命令(称为jobs)的输出中是否存在jobID。我通过外壳调用jobs,解析它的输出并查看jobID 是否存在。如果不是,则将其解释为作业终止的信号:
sleep = 2
while True:
output = subprocess.Popen("jobs %i" %(jobID),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
if job_done(output):
break
time.sleep(sleep)
由于sleep 设置为 2,这意味着每两秒检查一次,但作业可能会运行几个小时。我发现我有时会随机得到OSErrorCannot allocate memory,即使机器上有大量内存并且线程除了检查jobs 的输出之外没有执行任何内存密集型操作。这可能是什么原因造成的?有没有比使用Popen、PIPE 和communicate 更好的方法?
此问题似乎与此处报告的问题 (Python subprocess.Popen "OSError: [Errno 12] Cannot allocate memory") 相似,但没有解决此问题。
【问题讨论】:
-
The docs 建议在像您这样的情况下,通信很可能会耗尽内存
-
您提供的链接中有几种解决方案,例如,使用分叉服务器。
标签: python memory-management parallel-processing cluster-computing subprocess