所以我有一个函数,其中父进程创建假设两个子进程,因为有两个模式。
def data_push_main():
schema_name_list = schema_name.split(",")
pool = mp.Pool(processes=len(schema_name_list))
try:
for schema_name in schema_name_list:
pool.apply_async(data_push_per_schema, (config, schema_name))
pool.close()
pool.join()
except (KeyboardInterrupt, SystemExit):
pool.terminate()
pool.join()
logger.exception("Keyboard interrupt occured")
except Exception as e:
pool.terminate()
pool.join()
现在,当我开始运行程序时,ps -ef | grep
输出就像
as 3448 3209 1 11:47 pts/2 00:00:01 /usr/bin/python2.6 /export/app/i001/bin/data-push.pex
as 3464 3448 14 11:47 pts/2 00:00:15 /usr/bin/python2.6 /export/app/i001/bin/data-push.pex
as 3465 3448 9 11:47 pts/2 00:00:10 /usr/bin/python2.6 /export/app/i001/bin/data-push.pex
当我杀死其中一个子流程3464(使用kill -9
)时,整个过程运行良好。
当我杀死父进程,即3448时,它使3465成为父进程。这是预期的行为吗?是否应该调用except块并且池应该已经终止?当这个子进程现在终止时会发生什么?
观察:打印的最后一个过程
Traceback (most recent call last):
File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
self.run()
File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib64/python2.6/multiprocessing/pool.py", line 71, in worker
put((job, i, result))
File "/usr/lib64/python2.6/multiprocessing/queues.py", line 366, in put
return send(obj)
IOError: [Errno 32] Broken pipe