具有长时间运行进程的python WSGI

时间:2016-03-20 22:47:17

标签: python python-3.x mod-wsgi wsgi

我正在尝试编写一个简单的WSGI兼容应用程序来响应HTTP POST,将一些数据发送到服务器,关闭连接,以及 继续执行几秒钟。

运行时间较长,但运行时间不长。我必须在3秒内响应并关闭连接(Slack)但我的程序可能需要5秒左右才能实际运行。我可以负担得起运行足够的WSGI进程来处理负载,即使在5秒钟。

以下是一个例子:

import time

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    yield "foo\n".encode()
    # we're done responding to the server, close the connection

    time.sleep(5)
    with open('/tmp/foo', 'w') as stream:
        stream.write('output stuff\n')

在这个例子中,yield正确地刷新了东西,但是我想继续执行。我可以做一个fork然后在父级中返回() 就像我本来就是一个CGI剧本,但我对拥有一切并不满意 那个未被封闭的WSGI状态。

我使用Python 3.5和mod_wsgi进行测试,但我希望这是通用的/兼容的。

2 个答案:

答案 0 :(得分:1)

您是否考虑过线程池模型?您可以拥有生产者 - 消费者队列。只需从WSGI应用程序发布到队列并立即返回。这项工作将在另一个主题中完成。

答案 1 :(得分:1)

最后,代码很简单,我会自己回答:

@app.route("/foo", methods=['POST'])
def slack_request():
    """Process a slash-command POST request from Slack"""
    query = QuerySlack(app.config, app.mdb, reporter)
    job = Thread(target=query, args=(response.form['query'],))
    job.start()
    try:
        return "processing {}...".format(' '.join(response.form['query']))
    except (ReportError, QueryError) as err:
        return str(err)