Я не очень знаком со всем этим multiprocessing
, но установка глобальной переменной работает только с потоками.multiprocessing
создает различные процессы, поэтому глобальная переменная будет продублирована, и изменение значения будет видно только в текущем процессе.
Вместо этого используйте Manager
, который создаетобщий объект между процессами (словарь, список, например).
Могут быть более простые способы, но я решил создать общий Manager.list()
объект, который изначально пуст.
Когда комбинациянайдено, просто добавьте что-то в список.Протестируйте список на пустоту во всех процессах.Я адаптировал ваш пример так, чтобы он работал как есть (здесь не нужно numpy
, random.shuffle
отлично работает.
import multiprocessing as mp, random
import time
def testing(lst):
# code ....
start_time = time.time()
for x in range(1,500000):
gg = [1,2,3,4,5]
random.shuffle(gg)
if gg==[5,2,4,3,1]:
print(gg)
lst.append(1) # reflected on all processes
if lst:
# list is no longer empty: stop
print("stop")
break
total_time = time.time() - start_time
return total_time
if __name__ == '__main__':
manager = mp.Manager()
lst = manager.list()
with mp.Pool(processes=4) as pool:
ret = pool.starmap(testing, [(lst,) for x in range(4)])
print(ret)
след выполнения:
[5, 2, 4, 3, 1]
stop
stop
stop
stop
[0.031249523162841797, 0.015624523162841797, 0.015624523162841797, 0.015624523162841797]
как мы видим, 4 процесса остановились, когда один нашел «решение».