У меня проблема с расплывающимися параллелизмами, состоящая из множества задач, которые решаются независимо друг от друга. Решение каждой из задач довольно продолжительное, поэтому это основной кандидат на многопроцессорную обработку.Создание и повторное использование объектов в процессах python
Проблема в том, что решение моих задач требует создания определенного объекта, который сам по себе занимает много времени, но может использоваться повторно для всех задач (подумайте о внешней двоичной программе, которая должна быть запущена), поэтому в серийном версия я сделать что-то вроде этого:
def costly_function(task, my_object):
solution = solve_task_using_my_object
return solution
def solve_problem():
my_object = create_costly_object()
tasks = get_list_of_tasks()
all_solutions = [costly_function(task, my_object) for task in tasks]
return all_solutions
Когда я пытаюсь распараллелить программу с использованием многопроцессорной обработки, my_object
не может быть передан в качестве параметра для целого ряда причин (он не может быть маринованные, и он не должен работать больше, чем один задача в то же время), поэтому мне приходится прибегать к созданию отдельного экземпляра объекта для каждой задачи:
def costly_function(task):
my_object = create_costly_object()
solution = solve_task_using_my_object
return solution
def psolve_problem():
pool = multiprocessing.Pool()
tasks = get_list_of_tasks()
all_solutions = pool.map_async(costly_function, tasks)
return all_solutions.get()
, но дополнительные затраты на создание нескольких экземпляров my_object
делают этот код лишь незначительно быстрее, чем сериализованный.
Если бы я мог создать отдельный экземпляр my_object
в каждом процессе, а затем повторно использовать их для всех задач, которые будут выполняться в этом процессе, мои тайминги значительно улучшатся. Любые указатели на то, как это сделать?
Спасибо, сельдерей выглядит великолепно, но слишком много излишнего для моих целей, отдельный брокер для обмена сообщениями и весь шаблон приложения довольно немного для меня ... – Javier