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

具有长时间运行进程的python WSGI,python,python-3.x,mod-wsgi,wsgi,Python,Python 3.x,Mod Wsgi,Wsgi,我正在尝试编写一个简单的符合WSGI的应用程序,它响应HTTP POST,向服务器发送一些数据,关闭连接,然后 继续执行几秒钟 这是一个长时间运行的过程,但不是长时间运行的过程。我必须在3秒钟内响应并关闭连接(松弛),但我的程序实际运行可能需要5秒钟左右。我可以运行足够的WSGI进程来处理负载,即使是在5秒钟内 下面是一个例子: import time def application(environ, start_response): start_response('200 OK',

我正在尝试编写一个简单的符合WSGI的应用程序,它响应HTTP POST,向服务器发送一些数据,关闭连接,然后 继续执行几秒钟

这是一个长时间运行的过程,但不是长时间运行的过程。我必须在3秒钟内响应并关闭连接(松弛),但我的程序实际运行可能需要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状态


我使用Python3.5和mod_wsgi进行测试,但我希望它是通用的/兼容的。

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

最后,代码很简单,我将自己回答这个问题:

@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)

这实际上并没有按照你想要的方式解决问题,但是你知道你可以用一个空的响应来响应,然后对他们提供给你的
response\u url
进行请求吗?@l3via这正是我正在做的