Фляга питона: асинхронные запросы
В виде колбы я получаю данные через вызов 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 ответ
Вы не должны использовать 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 или celery, если вам нужна специфическая асинхронная обработка.
Надеюсь это поможет.