试图了解Python多处理池的行为

时间:2016-03-16 18:58:49

标签: python python-multiprocessing

所以我有一个函数,其中父进程创建假设两个子进程,因为有两个模式。

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

0 个答案:

没有答案