Как закрыть всех Исполнителей при выходе из приложения?

Я обычно не использую или нахожу потребность в регистраторах уровня класса, но я сохраняю свои модули в нескольких классах самое большее. Простое:

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
10
задан Joonas Pulakka 31 July 2009 в 09:51
поделиться

3 ответа

Нет ярлыка, чтобы сделать их все, нет. Кроме того, вам, вероятно, следует вызвать shutdownNow () , а не shutdown () , иначе вы могли бы немного подождать.

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

Если вы используете Spring, вы можете воспользоваться его фабричными компонентами. которые создают и управляют для вас исполнителями. Это включает в себя изящное завершение их работы при выходе из приложения и избавляет вас от необходимости управлять ими самостоятельно.

14
ответ дан 3 December 2019 в 14:11
поделиться

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

5
ответ дан 3 December 2019 в 14:11
поделиться

Вероятно, он имел в виду сказать, что JVM не может остановиться сама по себе, пока не завершатся потоки nondaemon. Это похоже на запуск простого класса из команды, такой как java SomeClass, и после выполнения основного метода JVM останавливается.

System.exit - это команда завершения JVM, даже если потоки демона запущены, JVM завершит работу.

0
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: