Force CherryPy Child Threads - PullRequest
       6

Force CherryPy Child Threads

9 голосов
/ 05 января 2010

Что ж, я хочу, чтобы 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 .... Могу ли я преодолеть это?

Ответы [ 2 ]

11 голосов
/ 05 января 2010

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

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.

0 голосов
/ 09 августа 2013

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

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

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

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

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

«stop»: когда шина находится в «STOPPING»”Состояние

“ изящный ”: когда шина запрашивает перезагрузку абонентов

“ выход ”: когда шина находится в состоянии“ ВЫХОД ”

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

..

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

cherrypy.engine.publish (channel, * args):

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

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

cherrypy.engine.subscribe (channel, callable) :

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

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

...