Вот моя простая программа факторизации, я добавил функцию обратного вызова в pool.apply_async(findK, args=(N,begin,end))
, приглашение сообщения prime factorization is over
, когда факторизация завершена, она отлично работает.
import math
import multiprocessing
def findK(N,begin,end):
for k in range(begin,end):
if N% k == 0:
print(N,"=" ,k ,"*", N/k)
return True
return False
def prompt(result):
if result:
print("prime factorization is over")
def mainFun(N,process_num):
pool = multiprocessing.Pool(process_num)
for i in range(process_num):
if i ==0 :
begin =2
else:
begin = int(math.sqrt(N)/process_num*i)+1
end = int(math.sqrt(N)/process_num*(i+1))
pool.apply_async(findK, args=(N,begin,end) , callback = prompt)
pool.close()
pool.join()
if __name__ == "__main__":
N = 684568031001583853
process_num = 16
mainFun(N,process_num)
Теперь я хочу изменить функцию обратного вызова в apply_async, чтобы изменить приглашение в функцию выключения, чтобы убить все остальные процессы.
def prompt(result):
if result:
pool.terminate()
Экземпляр пула не определен в строке запроса или передается в приглашение. pool.terminate()
не может работать в быстрой функции.
Как передать экземпляр multiprocessing.Pool функции apply_async'callback?
(Я сделал это в формате класса, просто для добавления метода класса и вызова self.pool.terminate может убить все остальные процессы,
как выполнить задание в формате функции?)
Если не задан пул как глобальная переменная, можно ли передать пул в функцию обратного вызова?