2

无法找到其他已实施此类事情的案例。

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

让我们假设一个非常基本的 WSGI 示例,因为所提供的内容并不是真正的问题。我将使用 Pocoo 在官方 Werkzeug 文档中提供的那个:

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
4

1 回答 1

2

读:

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

并查看代码监视器示例:

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

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

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

于 2012-01-21T08:15:18.107 回答