1

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?

+1

Ich bezweifle wirklich, dass der GC irgendetwas damit zu tun hat ... –

Antwort

1

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.

+0

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

+0

@stonemetal: Danke. Ich habe meine Antwort bearbeitet. –

+0

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

0
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.

0

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.

Verwandte Themen