Ich erstelle ein paar Worker-Prozesse mit Python Multiprocessing-Modul 2.6. In jedem Arbeiter verwende ich das Standardprotokollierungsmodul (mit Protokollrotation und Datei pro Arbeiter) , um den Arbeiter im Auge zu behalten. Ich habe festgestellt, dass nach ein paar Stunden keine weiteren Ereignisse in das Protokoll geschrieben werden. Der Prozess scheint nicht abzustürzen und antwortet immer noch auf Befehle über meine Warteschlange . Mit lsof kann ich sehen, dass die Protokolldatei nicht mehr geöffnet ist. Ich vermute, das Log-Objekt kann durch den Garbage Collector getötet werden, wenn ja, gibt es eine Möglichkeit , dass ich es markieren kann, um es zu schützen?Wie kann ich ein Protokollierungsobjekt vor dem Garbage Collector in einem Multiprocessing-Prozess schützen?
Antwort
Ich stimme mit @ THC4k. Dies scheint kein GC-Problem zu sein. Ich gebe dir meine Gründe, warum, und ich bin mir sicher, dass jemand mich abwählen wird, wenn ich falsch liege (wenn ja, hinterlasse bitte einen Kommentar, der auf meinen Fehler hinweist!).
Wenn Sie CPython verwenden, wird in erster Linie die Referenzzählung verwendet, und Objekte werden sofort zerstört, wenn die Ref-Zählung auf Null geht (seit 2.0 wird zusätzlich eine zusätzliche Garbage Collection zur Behandlung von Zirkelreferenzen bereitgestellt). Behalte einen Verweis auf dein Log-Objekt und es wird nicht zerstört.
Wenn Sie Jython oder IronPython verwenden, führt die zugrunde liegende VM die Garbage Collection durch. Behalten Sie eine Referenz bei und der GC sollte sie nicht berühren.
In beiden Fällen scheint es, dass Sie entweder keinen Bezug auf ein Objekt halten, das Sie am Leben erhalten müssen, oder Sie haben einen anderen Fehler.
CPython hat einen Mark und Sweep Garbage Collector. Es verwendet Referenzzählung als Leistungsverbesserung, so dass nicht kreisförmige Datenstrukturen nicht markiert und abgetastet werden müssen. In beiden Fällen ist die Lösung die gleiche, wenn Sie nicht wollen, dass etwas gesammelt wird, behalten Sie einen Hinweis darauf. – stonemetal
@stonemetal: Danke. Ich habe meine Antwort bearbeitet. –
Ich habe das Problem noch nicht nachverfolgt, aber soweit ich das beurteilen kann, scheint es, dass das Melden der Datei, die über lsof (htop) verloren gegangen ist, falsch war. Ich denke, es gibt einen Fehler in der Integration von htop/lsof :) – Marinus
http://docs.python.org/reference/datamodel.html#object.__del__
Nach dieser Dokumentation die del() Methode auf Objekt Zerstörung genannt wird und Sie können eine Referenz auf das Objekt an dieser Stelle schaffen, damit er nicht gesammelt werden. Ich bin mir nicht sicher, wie ich das machen soll, das gibt dir hoffentlich einige Denkanstöße.
Sie könnten sofort nach fork() gc.collect()
ausführen, um zu sehen, ob das das Protokoll geschlossen verursacht. Es ist jedoch unwahrscheinlich, dass die Garbage Collection erst nach einigen Stunden wirksam wird.
- 1. LogManager und Garbage Collector
- 2. Kopieren von Garbage Collector
- 3. JRuby - Wie starte ich den Garbage Collector?
- 4. Xcode: Garbage Collector Einstellung
- 5. Wie erzwinge ich den Garbage Collector?
- 6. Garbage Collector asp.net
- 7. Eclipse: Garbage Collector Button
- 8. Garbage Collector kann Speicherressourcen nicht wiederherstellen
- 9. V8-Garbage-Collector-Fehler
- 10. Wie kann ich sehen, welche Garbage Collector Java verwendet
- 11. Formular vor dem Einfrieren schützen
- 12. Garbage Collector Auswirkungen auf Solr
- 13. Ruft Garbage Collector Dispose() auf?
- 14. Wie kann ein Garbage Collector in einem WebView Android-Anwendung schließen?
- 15. Java Collections und Garbage Collector
- 16. aktuellen Mono Standard Garbage Collector
- 17. Warum den Garbage Collector deaktivieren?
- 18. Kann ich erkennen, wenn der Garbage Collector funktioniert?
- 19. Wie hakt man .NET Speichermanager/Garbage Collector?
- 20. Schützen Sie ein Blatt vor dem Öffnen in einer Arbeitsmappe
- 21. Wird der Garbage Collector in einem separaten Prozess ausgeführt?
- 22. Wie sollte ich vor harten Linkangriffen schützen?
- 23. Wie erkennt Pythons Garbage Collector kreisförmige Referenzen?
- 24. JAVA Multi-Threading, Speicherleck, Garbage Collector
- 25. Gibt JavaScript Garbage Collector globale Variablen an?
- 26. Wie kann ich Amazon SimpleDB vor SQL Injection schützen?
- 27. Garbage Collector zerstört Objekte von Interface Builder
- 28. Xamarin Garbage Collector und zirkuläre Referenzen
- 29. Hat Objective-C einen Garbage Collector auf dem iPhone?
- 30. Was hat Pythons GIL mit dem Garbage Collector zu tun?
Ich bezweifle wirklich, dass der GC irgendetwas damit zu tun hat ... –