Завершить все процессы при выполнении условия - PullRequest
0 голосов
/ 22 мая 2018

Я использую starmap для запуска функции тестирования.
Какой самый лучший / самый безопасный способ завершить все процессы, когда процесс впервые находит перестановку [5,2,4,3,1]?

import multiprocessing as mp
import time

def testing(lts):
    # 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] terminate all processes
    total_time = time.time() - start_time
    return total_time

if __name__ == '__main__':

    with mp.Pool(processes=4) as pool:
    ret = pool.starmap(testing, [(lst,) for x in range(4)])

1 Ответ

0 голосов
/ 22 мая 2018

Я не очень знаком со всем этим 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 процесса остановились, когда один нашел «решение».

...