在flask视图中,我通过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秒后回调函数被调用。
提前谢谢你!
发布于 2018-11-06 17:36:35
如果只需要异步调用,就不应该使用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。
希望这能有所帮助。
https://stackoverflow.com/questions/53103990
复制相似问题