Я обычно не использую или нахожу потребность в регистраторах уровня класса, но я сохраняю свои модули в нескольких классах самое большее. Простое:
import logging
LOG = logging.getLogger(__name__)
Наверху модуля и последующий:
LOG.info('Spam and eggs are tasty!')
отовсюду в файле обычно получает меня туда, где я хочу быть. Это избегает потребности в self.log
повсеместно, который имеет тенденцию беспокоить меня от обоих put-it-in-every-class перспектива и делает меня 5 символами ближе к 79 символьным строкам то соответствие.
Вы могли всегда использовать pseudo-class-decorator:
>>> import logging
>>> class Foo(object):
... def __init__(self):
... self.log.info('Meh')
...
>>> def logged_class(cls):
... cls.log = logging.getLogger('{0}.{1}'.format(__name__, cls.__name__))
...
>>> logged_class(Foo)
>>> logging.basicConfig(level=logging.DEBUG)
>>> f = Foo()
INFO:__main__.Foo:Meh
Нет ярлыка, чтобы сделать их все, нет. Кроме того, вам, вероятно, следует вызвать shutdownNow ()
, а не shutdown ()
, иначе вы могли бы немного подождать.
Я полагаю, что вы могли бы сделать, когда вы создадите Исполнитель, зарегистрируйте его в центральном месте. Затем, при завершении работы, просто вызовите shutdown ()
для этого центрального объекта, который, в свою очередь, может завершить работу каждого из зарегистрированных исполнителей.
Если вы используете Spring, вы можете воспользоваться его фабричными компонентами. которые создают и управляют для вас исполнителями. Это включает в себя изящное завершение их работы при выходе из приложения и избавляет вас от необходимости управлять ими самостоятельно.
Вы также можете предоставить реализацию ThreadFactory, которая помечает созданные потоки как потоки демона. Я предпочитаю чистый механизм выключения (с методами жизненного цикла), но есть случаи, когда вам не нужны гарантии относительно состояния / завершения незавершенных задач, когда это может быть целесообразно.
Вероятно, он имел в виду сказать, что JVM не может остановиться сама по себе, пока не завершатся потоки nondaemon. Это похоже на запуск простого класса из команды, такой как java SomeClass, и после выполнения основного метода JVM останавливается.
System.exit - это команда завершения JVM, даже если потоки демона запущены, JVM завершит работу.