Oto mój główny program faktoryzacji, dodałem funkcję zwrotną w pool.apply_async(findK, args=(N,begin,end))
, komunikat informujący o wyjściu prime factorization is over
po zakończeniu faktoryzacji, działa dobrze.Jak przekazać wystąpienie multiprocessing.Pool do funkcji zwrotnej apply_async?
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)
Teraz chcę zmienić funkcję zwrotną w apply_async, aby zmienić wiersz do funkcji zamykania systemu, aby zabić wszystkich innych procesów.
def prompt(result):
if result:
pool.terminate()
Instancja puli nie jest zdefiniowana w obszarze zasięgu lub przekazana do monitu.
pool.terminate()
nie może działać w trybie szybkiego podglądu.
Jak przekazać instancję wieloprocesorową do funkcji apply_async'callback?
(zrobiłem to zrobić w formacie klasy, po prostu dodać metodę klasy i wywołać self.pool.terminate może zabić wszystkie inne procesy, jak wykonać zadanie w formacie funkcji?)
jeśli nie ustawiono basen jako zmienną globalną, pula może zostać przekazana do funkcji zwrotnej?
jeśli nie ustawiono puli jako zmiennej globalnej, czy pula może zostać przekazana do funkcji zwrotnej? –