2016-04-06 39 views
1

Projemde pathos.multiprocessing.Pool kullanmayı deniyorum. Bununla birlikte, Havuzu sonlandırdığımda aşağıdaki sorunu karşılıyor. CentOS 6.5 kullanıyorum, pathos.multiprocessing.Pool veya başka bir şeyin neden olup olmadığından emin değilim, kimse bana yardımcı olabilir mi?Bazen pathos.multiprocessing.Pool doğru şekilde sonlandırılamıyor

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] Böyle süreç

kablolu şey başında, iyi çalışmasıdır. Fakat 4. iş alındığında, böyle bir sorun olacaktır.

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() 

cevap

0

OSError, Havuz tarafından değil, benim program sorunumdan kaynaklanır. Bir alt işlem oluşturmak ve ffmpeg yürütmek için Popen kullandığımda, (diğer sorun nedeniyle) hemen çıkacaktır, böylece alt işlemi durdurmaya çalıştığımda, o zaman varolmadı. Bu yüzden OSError yükseltilecek.