2015-10-31 22 views
2
mp.set_start_method('spawn') 
total_count = Counter(0) 
pool = mp.Pool(initializer=init, initargs=(total_count,), processes=num_proc)  

pool.map(part_crack_helper, product(seed_str, repeat=4)) 
pool.close() 
pool.join() 

所以我有一个工作进程池,做一些工作。它只需要找到一个解决方案。因此,当其中一个工作进程找到解决方案时,我想停止一切。Python多进程池。当其中一个工作进程确定没有更多工作需要完成时,如何退出脚本?

我想到的一种方法就是调用sys.exit()。但是,由于其他进程正在运行,这看起来似乎没有正常工作。

另一种方法是检查每个进程调用的返回值(part_crack_helper函数的返回值)并调用该进程的终止。但是,使用该映射函数时,我不知道该怎么做。

我该怎么做到这一点?

+0

看看'pool.apply_async'和'pool.terminate'。 –

回答

1

您可以使用Pool.apply_async的回调。

像这样的东西应该为你做这项工作。

from multiprocessing import Pool 


def part_crack_helper(args): 
    solution = do_job(args) 
    if solution: 
     return True 
    else: 
     return False 


class Worker(): 
    def __init__(self, workers, initializer, initargs): 
     self.pool = Pool(processes=workers, initializer=initializer, initargs=initargs) 

    def callback(self, result): 
     if result: 
      print "Solution found! Yay!" 
      self.pool.terminate() 

    def do_job(self): 
     for args in product(seed_str, repeat=4): 
      self.pool.apply_async(part_crack_helper, args=args, callback=self.callback) 
     self.pool.close() 
     self.pool.join() 
     print "good bye" 


w = Worker(num_proc, init, [total_count]) 
w.do_job() 
+0

谢谢!还没有尝试,但看起来很有希望! – whiteSkar

相关问题