Принудительно использовать дочерние потоки CherryPy

Что ж, я хочу, чтобы cherrypy убивал все дочерние потоки при автоматической перезагрузке вместо «Ожидания завершения дочерних потоков», потому что в моей программе есть собственные потоки, и я не знаю, как это обойти. CherryPy продолжает зависать на этой одной строке, и я не знаю, что делать, чтобы "дочерние потоки" прекратились...

`

[05/Jan/2010:01:14:24] ENGINE HTTP Server cherrypy._cpwsgi_server.CPWSGIServer(('127.0.0.1', 8080)) shut down
[05/Jan/2010:01:14:24] ENGINE Stopped thread '_TimeoutMonitor'.
[05/Jan/2010:01:14:24] ENGINE Bus STOPPED
[05/Jan/2010:01:14:24] ENGINE Bus EXITING
[05/Jan/2010:01:14:24] ENGINE Bus EXITED
[05/Jan/2010:01:14:05] ENGINE Waiting for child threads to terminate...

`

это никогда не продолжается. Поэтому я хочу заставить дочерние потоки закрыться...

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


person user233864    schedule 05.01.2010    source источник
comment
Я начинаю думать, что мне следует перегрузить автоматическую перезагрузку CherryPy, чтобы убить свой собственный client.thread... Но как, я не знаю.   -  person user233864    schedule 05.01.2010


Ответы (2)


Вам нужно написать код, который останавливает ваши потоки, и зарегистрировать его как прослушиватель для события «стоп»:

from cherrypy.process import plugins

class MyFeature(plugins.SimplePlugin):
    """A feature that does something."""

    def start(self):
        self.bus.log("Starting my feature")
        self.threads = mylib.start_new_threads()

    def stop(self):
        self.bus.log("Stopping my feature.")
        for t in self.threads:
            mylib.stop_thread(t)
            t.join()

my_feature = MyFeature(cherrypy.engine)
my_feature.subscribe()

См. http://www.cherrypy.org/wiki/BuiltinPlugins и http://www.cherrypy.org/wiki/CustomPlugins для более подробной информации.

person fumanchu    schedule 05.01.2010
comment
Хорошо. Я посмотрю на это. Я использую метод быстрого запуска. Могу ли я поместить эти методы запуска и остановки в свой корневой класс, который я использую с cherrypy.quickstart()? Или вы можете сказать мне, как я буду использовать этот класс MyFeature(), с моим уже корневым классом, который я использую Root().. Извините, я не очень активно использовал CherryPy.. - person user233864; 06.01.2010
comment
Конечно; вы можете разместить этот код где угодно; важно только то, что вы подписались на него, прежде чем запускать быстрый запуск. - person fumanchu; 11.01.2010

Это работает с быстрым запуском

def stopit():
    print 'stop handler invoked'
    #...
stopit.priority = 10
cherrypy.engine.subscribe('stop', stopit)

Для поддержки своего жизненного цикла CherryPy определяет набор общих каналов, которые будут публиковаться в различных состояниях:

«start»: когда шина находится в состоянии «STARTING»

«main»: периодически из основного цикла CherryPy.

"стоп": когда автобус находится в состоянии "ОСТАНОВКА"

«изящный»: когда шина запрашивает перезагрузку подписчиков.

«выход»: когда автобус находится в состоянии «ВЫХОД»

Этот канал будет опубликован движком автоматически. Поэтому зарегистрируйте всех подписчиков, которые должны будут реагировать на переходные изменения движка.

..

Для работы с шиной реализация предоставляет следующий простой API:

cherrypy.engine.publish(канал, *аргументы):

Параметр канала представляет собой строку, идентифицирующую канал, на который должно быть отправлено сообщение.

*args — это сообщение, которое может содержать любые допустимые значения или объекты Python.

cherrypy.engine.subscribe(channel, callable):

Параметр канала представляет собой строку, идентифицирующую канал, на котором будет зарегистрирован вызываемый объект.

callable — это функция или метод Python, сигнатура которого должна соответствовать тому, что будет опубликовано.

person Jithin    schedule 09.08.2013
comment
Почему за это проголосовали? Это также рекомендуется документами cherrypi. docs.cherrypy.org/en/latest/extend.html# встроенные каналы Не удалось найти информацию о поле приоритета. - person Alex G; 23.05.2019