Ich baue ein Python-Modul, um Tags aus einem großen Textkorpus zu extrahieren, und obwohl die Ergebnisse von hoher Qualität sind, wird es sehr langsam ausgeführt. Ich versuche, den Prozess zu beschleunigen, indem ich Multiprocessing verwende, und das hat auch funktioniert, bis ich versucht habe, ein Sperre einzuführen, damit nur ein Prozess gleichzeitig eine Verbindung zu unserer Datenbank herstellt. Ich kann einfach nicht herausfinden, wie ich das zum Laufen bringen kann - trotz intensiver Suche und Anpassung erhalte ich immer noch einen PicklingError: Can't pickle : attribute lookup thread.lock failed
. Hier ist der problematische Code - er hat gut funktioniert, bis ich versucht habe, ein Sperr-Objekt als Argument für f
zu übergeben.
def make_network(initial_tag, max_tags = 2, max_iter = 3):
manager = Manager()
lock = manager.Lock()
pool = manager.Pool(8)
# dies ist eine sehr teure Funktion, die ich parallelisieren möchte
# über eine Liste von Tags. Es beinhaltet einen (relativ günstigen) Aufruf zu einer externen
# Datenbank, die einen Sperrmechanismus benötigt, um gleichzeitige Abfragen zu vermeiden. Es akzeptiert eine Liste
# von Zeichenfolgen (Tags) als einziges Argument und gibt eine Liste von Sets mit Einträgen zurück,
# die der Eingabeliste entsprechen.
f = partial(get_more_tags, max_tags = max_tags, lock = lock)
def _recursively_find_more_tags(tags, level):
if level >= max_iter:
raise StopIteration
new_tags = pool.map(f, tags)
to_search = []
for i, s in zip(tags, new_tags):
for t in s:
joined = ' '.join(t)
print i + "|" + joined
to_search.append(joined)
try:
return _recursively_find_more_tags(to_search, level+1)
except StopIteration:
return None
_recursively_find_more_tags([initial_tag], 0)