Как я могу предотвратить бесконечное создание дочерних процессов в модуле (control.py), который я вызываю из другого модуля (Calling.py)? - PullRequest
0 голосов
/ 08 июля 2020

У меня есть модуль с именем control.py, в котором я использую следующий сокращенный код:

def parallel_execution():
    if __name__=="__main__":
       process=multiprocessing.Process(target=worker_function) ##the worker_function has been defined appropriately
       process.start()
       process.join()
    return
def main(main_args):
    if multiprocessing_flag == True:
       parallel_execution()
    
if __name__=='__main__':
    main(sys.argv[1:])

У меня есть еще один модуль с именем Calling.py, из которого я sh выполняю определенные функции многопроцессорной обработки. в parallel_execution (). Проблема в том, что если я использую блок (if __name__=='__main__' ), я не могу вызвать control.py из другого скрипта. Если я все еще использую runpy.run_module("control",run_name='__main__'), я получаю сообщение об ошибке, что worker_function не может быть обработан.

Как мне вызвать control.py, чтобы запустить функцию parallel_execution? Другими словами, есть ли способ запретить моему родительскому процессу бесконечно порождать дочерние процессы без использования if __name__=='__main__', чтобы я все еще мог вызывать control.py из Calling.py?

1 Ответ

0 голосов
/ 09 июля 2020

Есть 2 способа предотвратить рекурсивное порождение дочерних процессов. Один из них - блок кода if __name__=='__main__', который не позволяет дочернему процессу порождать дальнейшие процессы. Другой метод связан с тем, как работают дочерние процессы - на самом деле, когда дочерние процессы вызываются с использованием либо multiprocessing.Process, либо multiprocessing.Pool (который внутренне использует multiprocessing.Process), они наследуют сценарий, содержащий переданную целевую функцию. в multiprocessing.Process (target = worker_function, args = ...., ....). Таким образом, если скрипт, содержащий цель (worker_function), определен в отдельном модуле, а затем импортирован, то проблема рекурсивного порождения дочерних процессов устранена.

Reference- https://pymotw.com/3/multiprocessing/basics.html#importable -target- functions

Итак, в моем вопросе выше все, что мне нужно сделать, это поместить worker_function в модуль python отдельно от модуля «control.py».

...