Как использовать контекст фляги с concurrent.futures.ThreadPoolExecutor - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь сделать несколько запросов асинхронными и получить ответ обратно, я использую concurrent.futures, чтобы сделать это, но внутри моей функции, используя current_app, что из flask, и я всегда получаю эту ошибку:

RuntimeError: Working outside of application context.

Я не знаю, как решить это. Может кто-нибудь помочь, пожалуйста?

Ниже мой код:

run.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

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

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

Ответы [ 2 ]

0 голосов
/ 20 августа 2018

Я столкнулся с похожими проблемами, связанными с использованием concurrent.futures с Flask. Я написал Flask-Executor как оболочку, удобную для Flask, для concurrent.futures для решения этой проблемы. Это может быть проще для вас, чтобы работать с этими двумя вместе.

0 голосов
/ 29 апреля 2018

Вы должны импортировать свой экземпляр 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:
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...