我創建了一個程序,它可以被總結到這樣的多進程池:終止時,一名工人發現,妥善解決
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
功能combinations
從itertools
進口。 Function_2
返回True
或False
取決於輸入和在另一個類對象的方法,例如:
class Test_2(object):
def __init__(self, list):
self.comb_list = list
def function_2(self,c):
return c in self.comb_list
一切工作得很好。但現在我想稍微改變它並實現多處理。我發現this topic,顯示瞭如何退出腳本的例子,當工作進程的一個決定沒有更多的工作需要做。所以我做了以下修改:
- 加入池的定義爲
__init__
方法:self.pool = Pool(processes=8)
創建一個回調函數:
all_results = [] def callback_function(self, result): self.all_results.append(result) if(result): self.pool.terminate()
改變
function_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
不幸的是,它不能像我預期的那樣工作。爲什麼?調試後,它看起來像回調函數永遠不會到達。我認爲每個工人都會接觸到它。我錯了嗎?可能是什麼問題?
對於初學者,不要將實例方法傳遞給'multiprocessing.Pool'工具(或多處理代碼),因爲這是一個不想打開的包。 – zwer