Упаковка python модулей с многопроцессорным кодом - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь упаковать мой python проект в исполняемый файл, используя pyinstaller. Основной модуль содержит код для многопроцессорной обработки. Когда я запускаю исполняемый файл, снова и снова выполняются только строки кода до многопроцессорной части. Он также не генерирует исключение и не закрывает программу.

Код в основном модуле:

from Framework.ExcelUtility import ExcelUtility
from Framework.TestRunner import TestRunner
import concurrent.futures


class Initiator:

def __init__(self):
    self.exec_config_dict = {}
    self.test_list = []
    self.test_names = []
    self.current_test_set = []

def set_first_execution_order(self):
    # Code


def set_subsequent_execution_order(self):
    # Code

def kick_off_tests(self):
    '''Method to do Multi process execution'''
    if(__name__=="__main__"):
        with concurrent.futures.ProcessPoolExecutor(max_workers=int(self.exec_config_dict.get('Parallel'))) as executor:
            for test in self.current_test_set:
                executor.submit(TestRunner().runner,test)  ***This line is not being executed from the exe file.


initiator = Initiator()
initiator.get_run_info()
initiator.set_first_execution_order()
initiator.kick_off_tests()
while len(initiator.test_list) > 0:
    initiator.set_subsequent_execution_order()
    try:
        initiator.kick_off_tests()
    except BaseException as exception:
        print(exception)

1 Ответ

0 голосов
/ 26 апреля 2020

Из определения проблемы я предполагаю, что вы используете ms- windows, и что основной модуль не называется __main__.py.

В этом случае multiprocessing имеет некоторые специальные рекомендации:

Убедитесь, что основной модуль может безопасно импортироваться новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (таких как запуск нового процесса).

и

Вместо этого необходимо защитить «точку входа» программы, используя if __name__ == '__main__'

Итак, измените последнюю часть вашего основного модуля следующим образом:

from multiprocessing import freeze_support

def kick_off_tests(self):
    '''Method to do Multi process execution'''
        with concurrent.futures.ProcessPoolExecutor(max_workers=int(self.exec_config_dict.get('Parallel'))) as executor:
            for test in self.current_test_set:
                executor.submit(TestRunner().runner,test)  


if __name__ == '__main__':
    freeze_support()
    initiator = Initiator()
    initiator.get_run_info()
    initiator.set_first_execution_order()
    initiator.kick_off_tests()
    while len(initiator.test_list) > 0:
        initiator.set_subsequent_execution_order()
        try:
            initiator.kick_off_tests()
        except BaseException as exception:
            print(exception)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...