我是python的新手,尝试使用fork进行多进程。我想做的是在少数主机上运行命令。我可以使用下面的代码,但是如果任何一个孩子无法运行命令或命令本身失败,我也想停止执行。
def runCommand(host,comp):
if os.system("ssh "+host+" 'somecommand'") != 0:
print "somecommand failed on "+host+" for "+comp
sys.exit(-1)
def runMulti():
children = []
for comp,host in conHosts.iteritems():
pid = os.fork()
if pid:
children.append(pid)
else:
sleep(5)
runCommand(host,comp)
os._exit(0)
for i, child in enumerate(children):
os.waitpid(child, 0)
答案 0 :(得分:0)
您只需检查waitpid
的返回值,看看子进程是否退出时状态与0
不同:
had_error = any(os.waitpid(child, 0)[1] for child in children)
if had_error:
sys.exit(1)
注意:由于您要检查os.fork
的返回值,因此列表children
在子流程中将为空,因此any
将始终返回False
,即仅主进程最终将调用sys.exit
。
答案 1 :(得分:0)
os.fork()
在子进程中返回0
。所以你可以这样做:
if not os.fork():
# we now know we're the child process
execute_the_work()
if failed:
sys.exit()
sys.exit()
是退出python程序的pythonic方法。别忘了import sys
。
由于您似乎是初学者,请将failed
替换为判断任务是否失败的条件。
答案 2 :(得分:0)
我通过使用ThreadPool实现了这一目标。
pool = ThreadPool(len(hosts))
try:
pool.map(runMulti(), 'True')
pool.close()
pool.join()
except:
os.system('touch /tmp/failed')
commands.getoutput("killall -q ssh")
os.kill(os.getpid(),9)
我创建了一个临时文件,当池中的某个线程存在不同的状态时。谢谢大家:)