我正在尝试编写一个简单的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进行测试,但我希望这是通用的/兼容的。
答案 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)