Как выйти из процесса starmap_async, запущенного в многопроцессорном пуле? - PullRequest
1 голос
/ 23 апреля 2019

У меня много данных (более одного миллиона), и мне нужно выполнить некоторые вычисления, чтобы найти определенное значение из миллионов.Это отнимает много времени.Для ускорения процесса я стараюсь использовать все ядра процессора.Чтобы сделать это, я использую multiprocessing-pool и вызываю рабочий процесс с помощью starmap_async (мне нужно передать несколько аргументов).В основном, это работает до сих пор с ограничением, что я должен ждать, пока все значения списка не будут выполнены, и все процессы завершены, прежде чем я смогу продолжить.Есть ли возможность завершить процесс starmap, когда один из процессов найдет правильное значение?

Я уже пробовал несколько разных вещей, таких как завершение рабочего процесса, меняя всю структуру на цикл for, но кажется,что процесс starmap должен выполняться до конца и что их нельзя остановить.Единственный способ, по-видимому, состоит в том, чтобы извлекать каждое значение списка по отдельности и передавать его в отдельный процесс, что снова создает большие накладные расходы и значительно замедляет процесс.У кого-нибудь есть идея?

Описанное здесь решение Завершить многопроцессорную программу Python, если один из ее сотрудников удовлетворяет определенному условию выглядит так же, но это не так.Я пробовал это, но это не работает.Разница, кажется, в том, что ни один из аргументов не является итеративным в описанной проблеме.Я играл с этим, и я не мог заставить его завершить процессы до полного завершения процесса starmap.В рекомендуемом решении процессы запускаются и запускаются независимо, пока не будет найдено решение.В моем случае starmap, похоже, продолжает подпитывать процессы без проверки условий завершения.

import multiprocessing

def worker(x, arg1, arg2):
    some calculation with all arguments
    **#here I need a possibility to cancel all processes and return the current x value**

if __name__ == '__main__':
    arg1 = somthing
    arg2 = somthing_else
    value_list = (a,b,c,d,e,.......)
    pool = multiprocessing.Pool(cpu_count()) 
    p = pool.starmap_async(worker, [(value_list, arg1, arg2) for x in value_list])

    pool.close()
    pool.join()

    for y in p:
        if y = correct_value:
            print(correct_value)
            break
...