При работе с multiprocessing.Process в Python нет встроенного способа прямого получения возвращаемого значения целевой функции, аналогично тому, как thread.join() работает в многопоточности. Вместо этого вы можете использовать общие объекты, такие как multiprocessing.Manager или multiprocessing.Queue, для передачи результатов между процессами.
Ниже приведен пример пользовательской реализации с использованием CustomProcess, который расширяет multiprocessing.Process и использует multiprocessing.Manager для получения возвращаемого значения:
Примечание. Вы можете применить ниже функции декоратора run_function_with_multiprocessing для любого блока кода, в котором возникла проблема с утечкой памяти.
Код: Выделить всё
from multiprocessing import Process, Manager
class CustomProcess(Process):
def __init__(self, target, args=(), kwargs=None, shared_dict=None):
super().__init__()
self.target = target
self.args = args
self.kwargs = kwargs or {}
self.result = None
self.shared_dict = shared_dict
def run(self):
# Execute the target function and store the result
try:
self.result = self.target(*self.args, **self.kwargs)
except Exception as e:
print(f"Error while executing the target function: {e}")
self.result = None
self.shared_dict.update({
"result": self.result
})
def start(self):
print("Custom start method invoked!") # Custom behavior before starting
print(f"Preparing to execute target function: {self.target.__name__}")
# Call the base class's `start` method to start the process
super().start()
# Decorator / Wrapper function for multiprocessing
def run_function_with_multiprocessing(function):
def inner(*args, **kwargs):
with Manager() as manager:
shared_dict = manager.dict({
"result": None
})
print("Starting function in a separate process...")
process = CustomProcess(target=function, args=args, kwargs=kwargs, shared_dict=shared_dict)
process.start()
process.join() # Wait for the process to complete
result = shared_dict.pop("result", None)
process.close()
return result
return inner
# Example usage
@run_function_with_multiprocessing
def multiply(x, y):
return x * y
result = multiply(5, 6)
print(f"Result: {result}")
Как это работает:
Пользовательский класс процесса: Класс CustomProcess расширяет multiprocessing.Process и переопределяет метод run для сохранения возвращаемого значения целевой функции в общем словаре.
- Объект менеджера : multiprocessing.Manager предоставляет объект dict, которым можно поделиться. между процессами.
- Функция декоратора/обертки: Функция run_function_with_multiprocessing оборачивает любую цель функция, обрабатывает создание процесса и извлекает результат из общего словаря.
- Пользовательское поведение: Класс CustomProcess добавляет пользовательское поведение, такое как запись сообщений во время запуск процесса.
Подробнее здесь: https://stackoverflow.com/questions/793 ... riencing-m