(python2.7)
Я пытаюсь сделать своего рода сканер, который должен проходить через узлы CFG и разделяться на разные процессы при ветвлении для целей параллелизма.
Сканер представлен объектом класса Scanner. Этот класс имеет один метод traverse, который проходит по указанному графу и при необходимости разделяет его.
Вот как это выглядит:
class Scanner(object):
def __init__(self, atrb1, ...):
self.attribute1 = atrb1
self.process_pool = Pool(processes=4)
def traverse(self, ...):
[...]
if branch:
self.process_pool.map(my_func, todo_list).
Моя проблема заключается в следующем: как мне создать экземпляр multiprocessing.Pool, который будет использоваться всеми моими процессами? Я хочу, чтобы он был общим, потому что, поскольку путь можно снова разделить, я не хочу заканчиваться чем-то вроде форк-бомбы, а наличие одного и того же пула поможет мне ограничить количество процессов, выполняющихся одновременно.
Вышеприведенный код не работает, т.к. пул нельзя замариновать. В результате я попробовал это:
class Scanner(object):
def __getstate__(self):
self_dict = self.__dict__.copy()
def self_dict['process_pool']
return self_dict
[...]
Но, очевидно, это приводит к тому, что self.process_pool не определен в созданных процессах.
Затем я попытался создать пул как атрибут модуля:
process_pool = Pool(processes=4)
def my_func(x):
[...]
class Scanner(object):
def __init__(self, atrb1, ...):
self.attribute1 = atrb1
def traverse(self, ...):
[...]
if branch:
process_pool.map(my_func, todo_list)
Это не работает, и этот ответ а> объясняет, почему. Но вот в чем дело, где бы я ни создавал свой пул, чего-то не хватает. Если я создам этот пул в конце своего файла, он не увидит self.attribute1, так же как не увидит answer и завершается с ошибкой AttributeError.
Я даже не пытаюсь поделиться этим, и я уже застрял в многопроцессорном способе работы.
Я не знаю, правильно ли я думал обо всем этом, но я не могу поверить, что так сложно справиться с чем-то таким простым, как «иметь пул рабочих и давать им задачи».
Спасибо,
EDIT: я решил свою первую проблему (AttributeError), мой класс имел обратный вызов в качестве атрибута, и этот обратный вызов был определен в основном файле сценария после импорта модуля сканера... Но параллелизм и «не разветвляйте бомбу» по-прежнему являются проблемой.