【问题标题】:Force CherryPy Child Threads强制 CherryPy 子线程
【发布时间】:2010-01-05 06:24:29
【问题描述】:

好吧,我希望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 的线程一起退出......我可以克服这个问题吗?

【问题讨论】:

  • 我开始认为我应该重载 CherryPy 的自动重载来杀死我自己的 client.thread...但是如何,我不知道。

标签: python multithreading cherrypy


【解决方案1】:

您需要编写停止线程的代码,并将其注册为“停止”事件的侦听器:

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

【讨论】:

  • 好的。我会调查一下。我正在使用快速入门方法。我可以将这些启动和停止方法放在我与 cherrypy.quickstart() 一起使用的根类中吗?或者你能告诉我如何使用这个类 MyFeature(),我已经是根类,我正在使用 Root()..抱歉,我没有广泛使用 CherryPy..
  • 当然;您可以将该代码放在您喜欢的任何地方;唯一重要的是在运行快速入门之前订阅它。
【解决方案2】:

这适用于快速入门

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

为了支持其生命周期,CherryPy 定义了一组通用的 将在各个状态发布到的频道:

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

“main”:周期性地来自 CherryPy 的主循环

“stop”:当公交车处于“STOPPING”状态时

“优雅”:当总线请求重新加载订阅者时

“exit”:当总线处于“EXITING”状态时

该频道将由引擎自动发布。 因此,注册任何需要对 引擎的过渡变化。

..

为了与总线一起工作,实现提供了 以下简单 API:

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

channel 参数是一个字符串,用于标识要访问的频道。 消息应该发送到

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

cherrypy.engine.subscribe(频道,可调用)

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

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

【讨论】:

猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2011-06-16
  • 2020-08-16
  • 2011-12-17
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多