Python 当其中一个工作进程找到合适的解决方案时终止多进程池

Python 当其中一个工作进程找到合适的解决方案时终止多进程池,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我创建了一个程序,可以总结如下: from itertools import combinations class Test(object): def __init__(self, t2): self.another_class_object = t2 def function_1(self,n): a = 2 while(a <= n): all_combs = combinations(range(n),a) for c

我创建了一个程序,可以总结如下:

from itertools import combinations
class Test(object):
    def __init__(self, t2):
        self.another_class_object = t2

def function_1(self,n):
   a = 2
   while(a <= n):
       all_combs = combinations(range(n),a)
       for comb in all_combs:
           if(another_class_object.function_2(comb)):
              return 1
       a += 1
   return -1
一切正常。但现在我想对它做一点修改,实现多处理。我发现这是一个示例,说明了当一个辅助进程确定不再需要执行更多工作时如何退出脚本。因此,我做了以下更改:

  • 将池的定义添加到
    \uuuu init\uuuu
    方法中:
    self.pool=pool(processes=8)
  • 创建了一个回调函数:

    all_results = []
    def callback_function(self, result):
        self.all_results.append(result)
        if(result):
            self.pool.terminate()
    
  • 更改了
    功能\u 1

    def function_1(self,n):
        a = 2
        while(a <= n):
           all_combs = combinations(range(n),a)
           for comb in all_combs:
               self.pool.apply_async(self.another_class_object.function_2, args=comb, callback=self.callback_function)
           #self.pool.close()
           #self.pool.join()
           if(True in all_results):
               return 1
           a += 1
       return -1
    
    def函数_1(self,n):
    a=2
    
    虽然(a我没有尝试您的代码本身,但我尝试了您的结构。您确定问题出在回调函数而不是工作函数中吗?如果该函数是类方法,我没有设法让apply_async启动工作函数的单个实例。它只是没有做任何事情。apply_async完成时没有错误,但不会导入我是工人

    当我将worker函数(在您的例子中是另一个_class_object.function2)作为独立的全局函数移动到类之外时,它就开始按预期工作,回调被正常触发。相反,回调函数作为类方法似乎工作得很好

    这里似乎有关于这方面的讨论,例如:

    这有用吗


    Hannu

    我没有尝试您的代码,但我尝试了您的结构。您确定问题出在回调函数而不是辅助函数中吗?如果辅助函数是类方法,我没有设法让apply\u async启动该辅助函数的单个实例。它只是没有做任何事情。apply\u async完成时没有错误,但没有It’这不是工人

    当我将worker函数(在您的例子中是另一个_class_object.function2)作为独立的全局函数移动到类之外时,它就开始按预期工作,回调被正常触发。相反,回调函数作为类方法似乎工作得很好

    这里似乎有关于这方面的讨论,例如:

    这有用吗

    汉努

    问题:…没有如我预期的那样工作…会有什么问题

    始终需要
    get()
    池中获取结果。应用异步(…
    查看池进程中的错误

    更改为:

    pp = []
    for comb in all_combs:
        pp.append(pool.apply_async(func=self.another_class_object.function_2, args=comb, callback=self.callback_function))
    
    pool.close()
    
    for ar in pp:
        print('ar=%s' % ar.get())
    
    您将看到此错误:

    TypeError: function_2() takes 2 positional arguments but 3 were given
    
    要修复此错误,请将
    args=comb
    更改为
    args=(comb,)

    pp.append(pool.apply_async(func=self.another_class_object.function_2, args=(comb,), callback=self.callback_function))
    
    使用Python:3.4.2测试

    问题:…没有如我预期的那样工作…会有什么问题

    始终需要
    get()
    池中获取结果。应用异步(…
    查看池进程中的错误

    更改为:

    pp = []
    for comb in all_combs:
        pp.append(pool.apply_async(func=self.another_class_object.function_2, args=comb, callback=self.callback_function))
    
    pool.close()
    
    for ar in pp:
        print('ar=%s' % ar.get())
    
    您将看到此错误:

    TypeError: function_2() takes 2 positional arguments but 3 were given
    
    要修复此错误,请将
    args=comb
    更改为
    args=(comb,)

    pp.append(pool.apply_async(func=self.another_class_object.function_2, args=(comb,), callback=self.callback_function))
    

    使用Python:3.4.2测试

    对于初学者,不要将实例方法传递给
    多处理.Pool
    工具(或通常的多处理代码),因为这是您不想打开的一包伤害。对于初学者,不要将实例方法传递给
    多处理.Pool
    工具(或者通常是多处理代码)因为这是一包你不想打开的伤害。