强制CherryPy Child Threads

时间:2010-01-05 06:24:30

标签: python multithreading 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一起退出....我可以克服这个吗?

2 个答案:

答案 0 :(得分:11)

您需要编写停止线程的代码,并将其注册为“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/BuiltinPluginshttp://www.cherrypy.org/wiki/CustomPlugins

答案 1 :(得分:0)

这适用于快速入门

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

为了支持它的生命周期,CherryPy定义了一套常见的   将在各州公布的渠道:

     

“start”:当总线处于“STARTING”状态时

     

“main”:定期来自CherryPy的主循环

     

“停止”:当公交车处于“停止”状态时

     

“graceful”:当总线请求重新加载订户时

     

“退出”:当总线处于“退出”状态时

     

此频道将由引擎自动发布。   因此注册任何需要对其做出反应的订户   转换发动机的变化。

...

  

为了使用总线,实现提供了   遵循简单的API:

     

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

     

channel参数是一个字符串,用于标识通道   消息应该发送到

     

* args是消息,可能包含任何有效的Python值或对象。

     

cherrypy.engine.subscribe(频道,可赎回)

     

channel参数是一个字符串,用于标识可调用的通道   将被注册。

     

callable是签名必须匹配的Python函数或方法   什么将发表。