Фляга питона: асинхронные запросы

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

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

Другие вопросы по тегам