Как защитить объект журналирования от сборщика мусора в многопроцессорном процессе? - PullRequest
1 голос
/ 30 ноября 2010

Я создаю пару рабочих процессов, используя модуль многопроцессорной обработки Python 2.6.В каждом работнике я использую стандартный модуль журналирования (с ротацией журналов и файлом на одного работника), чтобы следить за работником.Я заметил, что через пару часов в журнал больше не записывается никаких событий.Процесс не завершается сбоем и все еще отвечает на команды через мою очередь.Используя lsof, я вижу, что файл журнала больше не открыт.Я подозреваю, что объект журнала может быть убит сборщиком мусора, если есть, то есть ли способ пометить его, чтобы защитить?

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Я согласен с @ THC4k.Это не похоже на проблему GC.Я приведу свои причины, и я уверен, что кто-то проголосует за меня, если я ошибаюсь (если так, пожалуйста, оставьте комментарий, указывающий на мою ошибку!).

Если вы используетеCPython, он в основном использует подсчет ссылок, и объекты уничтожаются немедленно, когда счетчик ссылок становится равным нулю (начиная с 2.0, дополнительная сборка мусора также предоставляется для обработки случая циклических ссылок).Сохраните ссылку на ваш объект журнала, и он не будет уничтожен.

Если вы используете Jython или IronPython, базовая виртуальная машина выполняет сборку мусора.Опять же, сохраните ссылку, и сборщик мусора не должен ее трогать.

В любом случае, похоже, что вы либо не сохраняете ссылку на объект, который необходимо сохранить, либо у вас есть какая-то другая ошибка.

0 голосов
/ 30 ноября 2010

Вы можете запустить gc.collect() сразу после fork (), чтобы посмотреть, не вызывает ли это закрытие журнала. Но вряд ли сбор мусора вступит в силу только через несколько часов.

0 голосов
/ 30 ноября 2010
http://docs.python.org/reference/datamodel.html#object.__del__

Согласно этой документации, метод del () вызывается при уничтожении объекта, и в этот момент вы можете создать ссылку на объект для предотвращения его сбора. Я не уверен, как это сделать, надеюсь, это даст вам пищу для размышлений.

...