如何在concurrent.futures.ThreadPoolExecutor中使用flask上下文

时间:2018-04-29 07:18:37

标签: python asynchronous flask

我试图让多个请求异步并获得回复,我使用concurrent.futures执行此操作,但在我的函数中使用来自{{1}的current_app我总是遇到这个错误:

flask

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

以下是我的代码:

run.py:

RuntimeError: Working outside of application context.

http_calls.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()

2 个答案:

答案 0 :(得分:1)

您应该在脚本中导入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:
            ...

答案 1 :(得分:1)

我在Flask上并发.futures遇到了类似的问题。我写了Flask-Executor作为Flask友好的包装,用于并发解决此问题。这可能是您将两者一起使用的一种更简单的方法。