Python 有时pathos.multiprocessing.Pool可以';不能正确终止

Python 有时pathos.multiprocessing.Pool可以';不能正确终止,python,centos,pool,terminate,Python,Centos,Pool,Terminate,我尝试在项目中使用paths.multiprocessing.Pool。 但是,当我终止池时,它将遇到以下问题。 我使用的是CentOS 6.5,我不确定它是否是由pathos.multiprocessing.Pool或其他东西引起的,有人能帮我吗 Traceback (most recent call last): File "/usr/local/lib/python2.7/threading.py", line 801, in __bootstrap_inner self.run(

我尝试在项目中使用paths.multiprocessing.Pool。 但是,当我终止池时,它将遇到以下问题。 我使用的是CentOS 6.5,我不确定它是否是由pathos.multiprocessing.Pool或其他东西引起的,有人能帮我吗

  Traceback (most recent call last):
File "/usr/local/lib/python2.7/threading.py", line 801, in __bootstrap_inner
  self.run()
File "/usr/local/lib/python2.7/threading.py", line 1073, in run
  self.function(*self.args, **self.kwargs)
File "receiver.py", line 132, in kill_clients
  pool.terminate()
File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 465, in terminate
  self._terminate()
File "/usr/local/lib/python2.7/site-packages/multiprocess/util.py", line 207, in __call__
  res = self._callback(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 513, in _terminate_pool
  p.terminate()
File "/usr/local/lib/python2.7/site-packages/multiprocess/process.py", line 137, in terminate
  self._popen.terminate()
File "/usr/local/lib/python2.7/site-packages/multiprocess/forking.py", line 174, in terminate
  os.kill(self.pid, signal.SIGTERM)
OSError:[Errno 3]没有这样的过程

有线的事情是,在一开始,它工作得很好。但是当收到第四份工作时,就会出现这样的问题

    class Receiver:
    def __init__(self):
        ....
        self.results={}
    def kill_clients(self, client_list, pool):
        for client in client_list:
            client.kill()
        pool.terminate()
    def process_result(self, result):
        if result is None:
            self.results = {}
            return
        res = result.split(':')
        if len(res) != 4:
            raise Exception("result with wrong format: %s" % result)
        self.results['%s_%s' % (res[0], res[1])] = {"code": res[3], "msg": res[4]}
    ...

     def handler(self, job):
        self.lg.debug("Receive job in rtmp_start_handler.")
        self.lg.debug("<%s>" % str(job))
        # each client corresponding one process
        cli_counts = job['count']
        pool = Pool(processes=cli_counts)
        clients = []
        try:
            for i in xrange(cli_counts):
                rtmp_cli = RtmpClient(job['case'], i)
                clients.append(rtmp_cli)
            [pool.apply_async(client.run, callback=self.process_result)
             for client in clients]
            pool.close()
            sleep(1)
            self.lg.debug("All clients are started.")
            t = Timer(
                job['timeout'],
                self.kill_clients,
                args=(clients, pool)
            )
            t.start()
            self.lg.debug("Timer is started. timeout %s s" % job['timeout'])
            pool.join()
        except Exception, e:
            self.lg.warning("Exception occurred: %s" % e)
            self.lg.warning(format_exc())
            return "0"

        # here the self.results shall be ready
        return self.parse_results()
类接收器:
定义初始化(自):
....
self.results={}
def kill_客户端(自身、客户端列表、池):
对于客户端列表中的客户端:
client.kill()
pool.terminate()
def处理结果(自身、结果):
如果结果为无:
self.results={}
返回
res=result.split(“:”)
如果len(res)!=4:
引发异常(“格式错误的结果:%s”%result)
self.results['%s\%s'(res[0],res[1])]={“code”:res[3],“msg”:res[4]}
...
def处理程序(自身、作业):
self.lg.debug(“在rtmp\u启动\u处理程序中接收作业”)
self.lg.debug(“%str(作业))
#每个客户端对应一个进程
cli_counts=作业['count']
池=池(进程=cli\u计数)
客户=[]
尝试:
对于X范围内的i(cli_计数):
rtmp_cli=RtmpClient(作业['case'],i)
clients.append(rtmp\u cli)
[pool.apply\u async(client.run,callback=self.process\u result)
客户中的客户]
pool.close()
睡眠(1)
self.lg.debug(“所有客户端都已启动”)
t=计时器(
作业['timeout'],
self.kill_客户,
args=(客户端,池)
)
t、 开始()
self.lg.debug(“计时器已启动。超时%s”%job['timeout']))
pool.join()
除例外情况外,e:
self.lg.警告(“发生异常:%s”%e)
self.lg.warning(格式为exc())
返回“0”
#在这里,应准备好自我测试结果
返回self.parse_results()

操作错误不是由池引起的,而是由我的程序问题引起的。
当我使用Popen创建一个子进程并执行ffmpeg时,它将立即退出(由于其他问题),因此当我试图终止该子进程时,它在那时并不存在。这就是为什么会出现操作错误。

操作错误不是由池引起的,而是由我的程序问题引起的。 当我使用Popen创建一个子进程并执行ffmpeg时,它将立即退出(由于其他问题),因此当我试图终止该子进程时,它在那时并不存在。这就是为什么会出现OSError