【问题标题】:How to use flask context with concurrent.futures.ThreadPoolExecutor如何将烧瓶上下文与 concurrent.futures.ThreadPoolExecutor 一起使用
【发布时间】:2018-04-29 07:18:37
【问题描述】:

我正在尝试使多个请求异步并获得响应,我正在使用 concurrent.futures 来执行此操作,但在我的函数内部使用来自 flaskcurrent_app 并且我总是收到此错误:

RuntimeError: Working outside of application context.

我不知道如何解决这个问题。有人可以帮忙吗?

下面是我的代码:

运行.py:

import concurrent.futures
from flask import current_app
from http_calls import get_price, get_items

def init():
    with current_app._get_current_object().test_request_context():
        with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
            futs = []
            futs.append(executor.submit(get_price))
            futs.append(executor.submit(get_items))

            print([fut.result() for fut in concurrent.futures.as_completed(futs)])

init()

http_calls.py

from flask import current_app

def get_price():
    url = current_app.config['get_price_url']
    return requests.get(url).json()

def get_items():
    url = current_app.config['get_items_url']
    return requests.get(url).json()

【问题讨论】:

    标签: python asynchronous flask


    【解决方案1】:

    我在使用 concurrent.futures 和 Flask 时遇到了类似的问题。我写了Flask-Executor 作为concurrent.futures 的Flask 友好包装器来解决这个问题。将这两者一起使用可能是一种更简单的方法。

    【讨论】:

      【解决方案2】:

      您应该在脚本中导入 Flask 实例。在应用上下文下使用current_app

      import concurrent.futures
      from your_application import your_app  # or create_app function to return a Flask instance
      from flask import current_app
      from http_calls import get_price, get_items
      
      def init():
          with your_app.app_context():
              with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
                  ...
      

      【讨论】:

      • 如果我不使用current_app,就不需要使用app_context()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2019-01-30
      • 2019-11-24
      • 2016-01-24
      相关资源
      最近更新 更多