Reputation: 1827
Well, I want cherrypy to kill all child threads on auto-reload instead of "Waiting for child threads to terminate" because my program has threads of its own and I don't know how to get past this. CherryPy keeps hanging on that one line and I don't know what to do to get the 'child threads' to terminate...
`
[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...
`
it never continues.. So i want to force the child threads to close ...
I know it is because my application is using threads of its own and I guess cherrypy wants those threads to quit along with CherryPy's.... Can I overcome this ?
Upvotes: 10
Views: 4421
Reputation: 77
This works with quickstart
def stopit():
print 'stop handler invoked'
#...
stopit.priority = 10
cherrypy.engine.subscribe('stop', stopit)
In order to support its life-cycle, CherryPy defines a set of common channels that will be published to at various states:
“start”: When the bus is in the “STARTING” state
“main”: Periodically from the CherryPy’s mainloop
“stop”: When the bus is in the “STOPPING” state
“graceful”: When the bus requests a reload of subscribers
“exit”: When the bus is in the “EXITING” state
This channel will be published to by the engine automatically. Register therefore any subscribers that would need to react to the transition changes of the engine.
..
In order to work with the bus, the implementation provides the following simple API:
cherrypy.engine.publish(channel, *args):
The channel parameter is a string identifying the channel to which the message should be sent to
*args is the message and may contain any valid Python values or objects.
cherrypy.engine.subscribe(channel, callable):
The channel parameter is a string identifying the channel the callable will be registered to.
callable is a Python function or method which signature must match what will be published.
Upvotes: 0
Reputation: 14559
You need to write code that stops your threads, and register it as a listener for the 'stop' event:
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()
See http://www.cherrypy.org/wiki/BuiltinPlugins and http://www.cherrypy.org/wiki/CustomPlugins for more details.
Upvotes: 14