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
工具(或者通常是多处理代码)因为这是一包你不想打开的伤害。