(python2.7)Gemeinsamer Pool Karte zwischen Prozessen mit objektorientierten Python
Ich versuche, eine Art von Scanner zu tun, die durch CFG Knoten zu gehen hat, und Split in verschiedenen Prozessen auf Verzweigung für den Parallelismus Zweck.
Der Scanner wird durch ein Objekt der Klasse Scanner repräsentiert. Diese Klasse hat eine Methode Traverse, die durch die genannte Grafik geht und bei Bedarf aufteilt.
hier, wie es aussieht:
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).
Mein Problem ist folgendes: Wie erstelle ich eine Instanz von multiprocessing.Pool, ist, dass zwischen allen meinen Prozessen geteilt? Ich möchte, dass es geteilt wird, denn da ein Pfad wieder aufgeteilt werden kann, möchte ich nicht mit einer Art Gabelbombe enden, und mit demselben Pool kann ich die Anzahl der gleichzeitig ablaufenden Prozesse begrenzen.
Der obige Code funktioniert nicht, da Pool nicht gebeizt werden kann. In der Folge habe ich versucht, dass:
class Scanner(object):
def __getstate__(self):
self_dict = self.__dict__.copy()
def self_dict['process_pool']
return self_dict
[...]
Aber offensichtlich, kommt es self.process_pool nicht definiert in den erstellten Prozesse zu haben.
Dann habe ich versucht, einen Pool als Modul-Attribut zu erstellen:
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)
Es funktioniert nicht, und dies erklärt, warum answer. Aber hier kommt die Sache, wo immer ich meinen Pool erstelle, fehlt etwas. Wenn ich diesen Pool am Ende meiner Datei erstelle, sieht er self.attribute1 nicht, genauso wie er answer nicht gesehen hat und mit einem AttributeError fehlschlägt.
Ich versuche noch nicht einmal, es zu teilen, und ich bin schon fest mit Multiprocessing Art und Weise zu tun.
Ich weiß nicht, ob ich nicht das ganze Ding richtig gedacht habe, aber ich kann nicht glauben, dass es so kompliziert ist, etwas so einfaches zu handhaben wie "einen Arbeiterpool zu haben und ihnen Aufgaben zu geben".
Danke,
EDIT: ich mein erstes Problem (Attribute) gelöst, hatte meine Klasse einen Rückruf als ihr Attribut, und dieser Rückruf wurde in der Hauptskriptdatei definiert, nach dem Import der Scanner-Modul ... Aber die Nebenläufigkeit und "Do not fork bomb" -Ding ist immer noch ein Problem.