在WSGI环境中启动单独的线程

时间:2012-01-18 19:38:04

标签: python multithreading wsgi werkzeug

无法找到其他类似情况的案例。

我有一个使用Werkzeug构建的WSGI应用程序,如果可能的话,我想在与WSGI应用程序相同的上下文中运行一些后台清理进程(我不想让它们单独使用它们。 cron,当应用程序作为服务启动时,必要的后台任务也在运行。)正在使用的Web服务器是带有mod_wsgi的Apache。

让我们假设一个非常基本的WSGI示例,因为所提供的内容并不是真正的问题。我将在official Werkzeug docs:

使用Pocoo
class Shortly(object):

    def __init__(self, config):
        self.redis = redis.Redis(config['redis_host'], config['redis_port'])

    def dispatch_request(self, request):
        return Response('Hello World!')

    def wsgi_app(self, environ, start_response):
        request = Request(environ)
        response = self.dispatch_request(request)
        return response(environ, start_response)

    def __call__(self, environ, start_response):
        return self.wsgi_app(environ, start_response)


def create_app(redis_host='localhost', redis_port=6379):
    app = Shortly({
        'redis_host':       redis_host,
        'redis_port':       redis_port
    })
    return app

create_app函数中启动另一个非阻塞执行线程是否可行,该函数将继续执行并按时间间隔执行这些任务? mod_wsgi会不断运行应用程序'这需要吗?

def create_app(redis_host='localhost', redis_port=6379):
    app = Shortly({
        'redis_host':       redis_host,
        'redis_port':       redis_port
    })

    #do some other stuff in a separate thread while the webapp is running
    task = threading.Thread(target=DBCleanup, args=(query, stuff))
    task.start()
    return app

1 个答案:

答案 0 :(得分:2)

读:

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

并查看代码监视器示例:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes

第一个是关于如何在请求结束和流程结束时清理事物的一般示例。

第二个展示了如何创建后台线程来基于周期执行操作并在进程退出时正确尝试并关闭后台线程。