Вызов модуля многопроцессорности Python из C/C++ приводит к бесконечному добавлению новых процессов ⇐ Python
Вызов модуля многопроцессорности Python из C/C++ приводит к бесконечному добавлению новых процессов
Я работаю над проектом с необычной структурой в системе Windows: c++ main() вызывает функцию многопроцессорности Python через C API. Фреймворк хорошо работает без многопроцессорности. После использования модуля Multiprocessing (даже всего 1 процесса) программа продолжает добавлять новые процессы c++ main() exe. Автономный скрипт Python хорошо работает с используемым многопроцессорным модулем. Я думаю, это связано с реализацией многопроцессорного модуля; поиск в Интернете не нашел никакой соответствующей информации. Может ли кто-нибудь дать подсказку? Спасибо!
start.py
время импорта импортировать многопроцессорность как mp защита do_something(): print('Сплю 1 секунду...') время.сон(1) print('Сон закончил...') определение бенчмарка(): начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) p1.start() #p2.start() p1.join() #p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') если __name__ == '__main__': тест() callPythonFromCpp.cpp
#include #include #include #include использование пространства имен std; void CallPython (строка PythonModuleName, строка PythonFunctionName) { char* funcname = новый char[PythonFunctionName.length() + 1]; strcpy_s(имя_функции, PythonFunctionName.length() + 1, PythonFunctionName.c_str()); char* имя_модуля = новый char[PythonModuleName.length() + 1]; strcpy_s(modname, PythonModuleName.length() + 1, PythonModuleName.c_str()); // Инициализируем интерпретатор Python Py_Initialize(); PyObject* my_module = PyImport_ImportModule(имя модуля); PyObject* my_function = PyObject_GetAttrString(my_module, funcname); // Вызов вызываемого объекта Python callable с аргументами, заданными кортежем args. // Если аргументы не нужны, то аргументы могут быть NULL. PyObject* my_result = PyObject_CallObject(my_function, NULL); // Отменяем все инициализации, выполненные с помощью Py_Initialize(), и последующее использование функций API Python/C, // и уничтожаем все субинтерпретаторы (см. Py_NewInterpreter() ниже), которые были созданы, но еще не созданы // уничтожено с момента последнего вызова Py_Initialize(). В идеале это освобождает всю память, выделенную интерпретатором Python. Py_Finalize(); удалить [] имя_функции; удалить [] имя мода; } интервал основной() { CallPython("старт", "тест"); система("пауза"); вернуть 0; } введите здесь описание изображения
[*]Вызовите Python с однопроцессным кодированием из C++ main(), это работает хорошо; [*]Вызов многопроцессорного Python из C++ main(), он продолжает добавлять новый процесс, код Python не выполняется; [*]Запускайте многопроцессорный скрипт Python автономно, он хорошо работает параллельно.
Обновлено: напечатайте sys.executable и os.getpid() в коде Python; При вызове p1.start() рекурсивно вызывается новый процесс C++ main(). Я думаю, это связано с тем, как многопроцессорность идентифицирует основные и дочерние процессы. например, автономный Python имеет «if name == 'main'», что необходимо для использования многопроцессорного модуля.
Обновление Python:
def тест(): начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) print('sys.executable: ' + sys.executable + '\n') print('os pid: ' + str(os.getpid()) + '\n') p1.start() #p2.start() #p1.join() #p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') Вывод терминала:
sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 25408 Закончено за 0,08 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 32332 Завершено за 0,01 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 9456 Завершено за 0,01 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 8944 Обновление от 23 ноября 2023 г. После этого поста Встроенный Python: многопроцессорность не работает моя программа работает сейчас. Код C++ остается прежним; Код Python, как показано ниже:
время импорта импортировать многопроцессорность как mp защита do_something(): print('Сплю 1 секунду...') время.сон(1) print('Сон закончил...') определение бенчмарка(): sys.argv = [r'C:\path_to_this\start.py'] mp.set_executable(r'C:\path_to_Python_install\python.exe') начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) p1.start() p2.start() p1.join() p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') если __name__ == '__main__': тест()
Я работаю над проектом с необычной структурой в системе Windows: c++ main() вызывает функцию многопроцессорности Python через C API. Фреймворк хорошо работает без многопроцессорности. После использования модуля Multiprocessing (даже всего 1 процесса) программа продолжает добавлять новые процессы c++ main() exe. Автономный скрипт Python хорошо работает с используемым многопроцессорным модулем. Я думаю, это связано с реализацией многопроцессорного модуля; поиск в Интернете не нашел никакой соответствующей информации. Может ли кто-нибудь дать подсказку? Спасибо!
start.py
время импорта импортировать многопроцессорность как mp защита do_something(): print('Сплю 1 секунду...') время.сон(1) print('Сон закончил...') определение бенчмарка(): начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) p1.start() #p2.start() p1.join() #p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') если __name__ == '__main__': тест() callPythonFromCpp.cpp
#include #include #include #include использование пространства имен std; void CallPython (строка PythonModuleName, строка PythonFunctionName) { char* funcname = новый char[PythonFunctionName.length() + 1]; strcpy_s(имя_функции, PythonFunctionName.length() + 1, PythonFunctionName.c_str()); char* имя_модуля = новый char[PythonModuleName.length() + 1]; strcpy_s(modname, PythonModuleName.length() + 1, PythonModuleName.c_str()); // Инициализируем интерпретатор Python Py_Initialize(); PyObject* my_module = PyImport_ImportModule(имя модуля); PyObject* my_function = PyObject_GetAttrString(my_module, funcname); // Вызов вызываемого объекта Python callable с аргументами, заданными кортежем args. // Если аргументы не нужны, то аргументы могут быть NULL. PyObject* my_result = PyObject_CallObject(my_function, NULL); // Отменяем все инициализации, выполненные с помощью Py_Initialize(), и последующее использование функций API Python/C, // и уничтожаем все субинтерпретаторы (см. Py_NewInterpreter() ниже), которые были созданы, но еще не созданы // уничтожено с момента последнего вызова Py_Initialize(). В идеале это освобождает всю память, выделенную интерпретатором Python. Py_Finalize(); удалить [] имя_функции; удалить [] имя мода; } интервал основной() { CallPython("старт", "тест"); система("пауза"); вернуть 0; } введите здесь описание изображения
[*]Вызовите Python с однопроцессным кодированием из C++ main(), это работает хорошо; [*]Вызов многопроцессорного Python из C++ main(), он продолжает добавлять новый процесс, код Python не выполняется; [*]Запускайте многопроцессорный скрипт Python автономно, он хорошо работает параллельно.
Обновлено: напечатайте sys.executable и os.getpid() в коде Python; При вызове p1.start() рекурсивно вызывается новый процесс C++ main(). Я думаю, это связано с тем, как многопроцессорность идентифицирует основные и дочерние процессы. например, автономный Python имеет «if name == 'main'», что необходимо для использования многопроцессорного модуля.
Обновление Python:
def тест(): начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) print('sys.executable: ' + sys.executable + '\n') print('os pid: ' + str(os.getpid()) + '\n') p1.start() #p2.start() #p1.join() #p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') Вывод терминала:
sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 25408 Закончено за 0,08 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 32332 Завершено за 0,01 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 9456 Завершено за 0,01 секунды sys.executable: C:\Users\xxx\source\repos\callPythonFromCpp\x64\Release\callPythonFromCpp.exe идентификатор ОС: 8944 Обновление от 23 ноября 2023 г. После этого поста Встроенный Python: многопроцессорность не работает моя программа работает сейчас. Код C++ остается прежним; Код Python, как показано ниже:
время импорта импортировать многопроцессорность как mp защита do_something(): print('Сплю 1 секунду...') время.сон(1) print('Сон закончил...') определение бенчмарка(): sys.argv = [r'C:\path_to_this\start.py'] mp.set_executable(r'C:\path_to_Python_install\python.exe') начало = time.perf_counter() p1 = mp.Process(target=do_something) p2 = mp.Process(target=do_something) p1.start() p2.start() p1.join() p2.join() финиш = time.perf_counter() print(f'Завершено через {round(finish - start,2)} секунд(ы)') если __name__ == '__main__': тест()
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сохранение PDF-документа с помощью PDFBox приводит к бесконечному зависанию
Anonymous » » в форуме JAVA - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Angular Infinite Scroll с отсортированным списком приводит к бесконечному циклу
Anonymous » » в форуме Jquery - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-