Just wanted to mention to you (and anyone who reads this ;) that the latest CherryPy release, 3.1.0, works with GAE with no modifications now. Thanks for investigating this and pointing out where the blockers were.
Assuming wsgiref.handlers.CGIHandler().run(app) blocks until you hit Ctrl-C, you should at least wrap that in a try/finally and call cherrypy.engine.stop() to shut down any other threads which CP started. I'd also recommend you call engine.start() just before run, but that will also require cherrypy.server.unsubscribe() to turn off the default HTTP server.
I'd be interested to know how the other engine plugins, like autoreload, daemonization, pidfiles, drop privs, and signal handling work (or not) in GAE. Depending on how much is restricted, we might invent a 'GAE' environment to go alongside 'production' and 'staging'.
CherryPy 3.1 final
Assuming wsgiref.handlers.CGIHandler().run(app) blocks until you hit Ctrl-C, you should at least wrap that in a try/finally and call cherrypy.engine.stop() to shut down any other threads which CP started. I'd also recommend you call engine.start() just before run, but that will also require cherrypy.server.unsubscribe() to turn off the default HTTP server.
I'd be interested to know how the other engine plugins, like autoreload, daemonization, pidfiles, drop privs, and signal handling work (or not) in GAE. Depending on how much is restricted, we might invent a 'GAE' environment to go alongside 'production' and 'staging'.