Python: можно ли завершать процессы в пуле только через pool.terminate()?

Я пытаюсь завершить процессы, принадлежащие пулу. Процессы пула выполняют расчеты, и кнопка остановки в графическом интерфейсе должна завершить эти расчеты.

Кажется, самый простой способ сделать это — вызвать pool.terminate(). Эта опция мне недоступна, потому что у меня нет доступа к переменной пула в моей области. Он был создан в файле, который я не хотел бы редактировать.

Я попробовал подход, завершив процессы по идентификатору процесса. Я получаю pids из списка, созданного active_children. Но похоже, что os.kill не влияет, так как все процессы остаются. Где я ошибся / как я могу решить эту проблему? Буду признателен за любую помощь.

Ниже приведен минимальный воспроизводимый пример. Также, если мой пост указывает на очевидный недостаток знаний, это, вероятно, правда, и я извиняюсь. благодарю вас

from multiprocessing import Pool
from multiprocessing import active_children
import os, signal


if __name__ == '__main__':
    pool = Pool()
    print(active_children())

    for process in active_children():
        pid = process.pid
        os.kill(pid, signal.SIGTERM)

    print(active_children())  #same output as previous print statement
    pool.terminate()
    print(active_children())  #returns an empty list

person Teldryn0    schedule 25.07.2020    source источник
comment
Можете ли вы изменить задачи/функции, которые выполняются в пуле?   -  person wwii    schedule 25.07.2020
comment
Отображаются ли процессы с pid, заданными process.pid, в списках операционной системы? Если вы работаете в Linux, введите ps -A в терминале, чтобы узнать. В Windows, может быть, TaskManager? Основываясь на том, что я вижу, опробовав ваш код, возможно, пул просто показывает вам объекты процесса, у которых больше нет процесса.   -  person Yosef Meller    schedule 25.07.2020
comment
@wwii: Если я попрошу разрешения, я смогу. В основном я создаю графический интерфейс для чьей-то программы, и я пытаюсь сохранить его код нетронутым. Если я не могу найти здесь решение, я изменю его, чтобы использовать pool.terminate(). Надеюсь, я правильно понял ваш вопрос.   -  person Teldryn0    schedule 25.07.2020
comment
@Yosef Meller: К сожалению, все процессы все еще работают и загружают процессор в соответствии с TaskManager.   -  person Teldryn0    schedule 25.07.2020
comment
Одним из вариантов может быть периодическое выполнение задач в поисках сигнала для остановки, а затем активация этого сигнала в графическом интерфейсе. Но если у вас нет возможности общаться с процессами и ограничениями на изменение существующих файлов, это не сработает, здесь, на SO, есть ряд похожих вопросов и ответов, но все они основаны на контроле процессов. /задачи. Или попросите вашего друга сделать пул переменной уровня модуля, которую вы сможете использовать при импорте модуля.   -  person wwii    schedule 25.07.2020
comment
@wwii: Спасибо за помощь. Я, скорее всего, просто сделаю это, потому что это проще, чем продолжать просматривать форумы и темы. Я все еще немного удивлен, что завершение по pid не сработало.   -  person Teldryn0    schedule 25.07.2020
comment
Вы сталкивались с - stackoverflow.com/a/17858114/2823755?   -  person wwii    schedule 25.07.2020