Ich habe eine kurze Funktion, um zu überprüfen, ob ein Wort ein echtes Wort ist, indem ich es mit dem WordNet-Korpus aus dem Natural Language Toolkit vergleiche. Ich rufe diese Funktion von einem Thread, der TXT-Dateien validiert. Wenn ich meinen Code ausführe, wird beim ersten Aufruf der Funktion ein AttributeError mit der Nachricht
ausgelöst %Vor%Wenn ich die Ausführung pausiere, wirft die selbe Codezeile keinen Fehler, daher nehme ich an, dass der Korpus bei meinem ersten Aufruf noch nicht geladen ist und den Fehler verursacht.
Ich habe versucht, mit nltk.wordnet.ensure_loaded()
den Corpus zu laden, aber ich bekomme immer noch den gleichen Fehler.
Hier ist meine Funktion:
%Vor%Wenn ich eine print-Anweisung in derselben Datei im globalen Bereich habe, wird der Fehler nicht ausgegeben. Wenn ich es jedoch von meinem Thread aus anrufe, tut es das. Das folgende ist ein minimales Beispiel, um den Fehler zu reproduzieren. Ich habe es getestet und auf meinem Rechner gibt es die Ausgabe
%Vor%Minimales Beispiel:
%Vor%Ich habe Ihren Code ausgeführt und den gleichen Fehler erhalten. Für eine funktionierende Lösung, siehe unten. Hier ist die Erklärung:
LazyCorpusLoader
ist ein Proxy-Objekt, das vor einem Corpus-Objekt steht der Korpus ist geladen. (Dies verhindert, dass die NLTK große Korpora in den Speicher lädt, bevor sie benötigt werden.) Beim ersten Zugriff auf dieses Proxy-Objekt wird jedoch zu dem Korpus, den Sie laden möchten. Das heißt, das Proxy-Objekt LazyCorpusLoader
transformiert seine __dict__
und __class__
in die __dict__
und __class__
des Korpus, den Sie laden.
Wenn Sie Ihren Code mit den obigen Fehlern vergleichen, können Sie sehen, dass Sie 9 Fehler erhalten haben, als Sie versucht haben, 10 Instanzen Ihrer Klasse zu erstellen. Die erste Umwandlung des LazyCorpusLoader
-Proxy-Objekts in ein WordNetCorpusReader
-Objekt war erfolgreich. Diese Aktion wurde ausgelöst, als Sie zum ersten Mal auf wordnet zugegriffen haben:
Der erste Thread
%Vor%Der zweite Thread
Wenn Sie Ihre is_good_word
-Funktion in einem zweiten Thread ausführen, hat Ihr erster Thread das LazyCorpusLoader
-Proxy-Objekt jedoch nicht vollständig in ein WordNetCorpusReader
umgewandelt. wn
ist immer noch ein LazyCorpusLoader
Proxy-Objekt, daher wird der Prozess __load
erneut gestartet. Sobald es zu dem Punkt kommt, an dem es versucht, seine __class__
und __dict__
in ein WordNetCorpusReader
Objekt zu konvertieren, hat der erste Thread das LazyCorpusLoader
Proxy-Objekt jedoch bereits in eine WordNetCorpusReader
konvertiert. Meine Vermutung ist, dass in der Zeile mit meinem Kommentar unten ein Fehler auftritt:
Sobald der erste Thread das Proxy-Objekt LazyCorpusLoader
in ein Objekt WordNetCorpusReader
transformiert hat, funktionieren die verstümmelten Namen nicht mehr. Das WordNetCorpusReader
-Objekt wird nicht LazyCorpusLoader
irgendwo in seinen verkrüppelten Namen haben. ( self.__args
ist äquivalent zu self._LazyCorpusLoader__args, während das Objekt ein Objekt LazyCorpusLoader
ist.) Daher erhalten Sie den folgenden Fehler:
Eine Alternative
Angesichts dieses Problems möchten Sie auf das wn
-Objekt zugreifen, bevor Sie in Ihr Threading eingeben. Hier ist Ihr Code entsprechend geändert:
Ich habe den obigen Code getestet und keine Fehler erhalten.
Tags und Links python multithreading attributes exception nltk