【问题标题】:python WSGI with long running process具有长时间运行进程的python WSGI
【发布时间】:2016-03-20 22:47:17
【问题描述】:

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

这是一个运行时间较长,但不是 LONG 运行的过程。我必须在 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 正确地刷新了一些东西,但我想继续执行。我可以做一个叉子,然后在父级中返回(), 就像我希望这是一个 CGI 脚本一样,但我对拥有所有内容并不满意 那个未关闭的 WSGI 状态。

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

【问题讨论】:

  • 这实际上并没有按照你想要的方式解决它,但是你知道你可以用一个空的响应来响应,然后向他们给你的response_url 发出请求吗?
  • @L3viathan 这正是我正在做的事情

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最后,代码很琐碎,我自己来回答:

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

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多