Создать асинхронную функцию в Flask, используя Python 3.5? - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь обновить приложение Slack для своей компании, которое запросит наш API, выполнит несколько вычислений и выложит хороший отчет. Проблема в том, что запуск отчета занимает около 7-10 секунд, а Slack допускает тайм-аут только 3000 мс для команды слэша.

Это не большая проблема, потому что вы можете сразу же ответить сообщением, подтверждающим команду, а затем, когда отчет завершится, ответить снова.

Остальная часть нашего приложения Slack написана с бэкэндом Flask и размещена на сервере Ubuntu 16.04, поэтому мы запускаем Python 3.5.

Код, который я нашел , который демонстрирует, как делать то, что я хочу, использует библиотеку Zappa, которая выглядит как для lamdba AWS, использует декоратор @task, чтобы заставить функцию быть асинхронной. К сожалению, он работает не на Python 3.6.

Пример кода из учебника:

@task
def hello_there_task(response_url):
    sleep(5)

    data = {
        'response_type': 'in_channel',
        'text': 'You _are_ a bold one.',
    }

    requests.post(response_url, json=data)


@app.route('/hello-there', methods=['POST'])
def hello_there():
    if not is_request_valid(request):
        abort(400)

    hello_there_task(request.form['response_url'])

    return jsonify(
        response_type='in_channel',
        text='<https://youtu.be/frszEJb0aOo|General Kenobi!>',
    )

Мой вопрос: как я могу сделать hello_there_task асинхронным в Python 3.5? Это не должен быть декоратор, хотя это не повредит для будущего использования.

1 Ответ

0 голосов
/ 03 июля 2018

Как я понял из краткого обзора Zappa, декоратор @task не делает функцию асинхронной, а представляет собой просто интерфейс для исполнителя Zappa. В чистом Python ThreadPoolExecutor и ProcessPoolExecutor кажутся очень похожими на него.

...