фляга питона: асинхронные запросы - PullRequest
0 голосов
/ 01 ноября 2018

В виде колбы я получаю данные через вызов API, и эти данные должны быть переданы во внешний API, который иногда очень медленный.

Итак, я хочу, чтобы представление возвращало положительный код состояния, пока запрос обрабатывается асинхронно.

Я пробовал с запросами-фьючерсами и испытываю трудности с обратным вызовом:

def bg_cb(sess, resp):
    print(resp.text)

@app.route('/incomingdata', methods=['POST',])
def clients():

    (... process incoming POST data and create outgoing API call. here I inserted a demo call to httpbin.org that simulates a very slow API ...)

    from requests_futures.sessions import FuturesSession
    session = FuturesSession()
    future = session.get('http://httpbin.org/delay/3', background_callback=bg_cb)
    response = future.result()

    return jsonify({'status': 'ok'}), 200

К сожалению, приведенный выше код будет ожидать возврата, пока обратный вызов не будет обработан. Вот это 3 секунды.

Как мне добиться результата, чтобы представление немедленно возвращало ответ с 200, и через 3 секунды вызывается функция обратного вызова.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Не следует использовать result(), если вам нужно просто вызвать что-то асинхронно. Метод result() будет ожидать завершения background_callback. Просто пример:

def bg_cb(sess, resp):
    print('done')

# in view:
print('call async...')
session.get('http://httpbin.org/delay/3', background_callback=bg_cb)

return jsonify({'status': 'ok'}), 200

Позвоните на конечную точку, вы увидите ответ без задержки. Консольный вывод:

call async...
# after few seconds
done

Теперь давайте дождемся завершения обратного вызова:

future = session.get('http://httpbin.org/delay/3', background_callback=bg_cb)
print('wait result...')
response = future.result()
print('after result...')

Позвоните на конечную точку, вы увидите ответ с задержкой. Консольный вывод:

wait result...
done
after result...

Итак, вам не нужно result(), если вам нужно просто запустить что-то асинхронно.

Также вы можете использовать rq или сельдерей , если вам нужна специальная асинхронная обработка.

Надеюсь, это поможет.

...