【发布时间】:2017-07-20 20:52:05
【问题描述】:
对于一个微不足道的请求,慢速函数(如代码 cmets 所示)总共需要 11 秒;比调用 API 的 10 秒时间限制高出一个数量级。
无法进行优化,因为其中一些 API 是第三方的。我认为我需要的是找到一种方法,将 API 调用卸载到异步任务(而不是正常的顺序编程)、进程或线程中,这可能在它自己的时间内发生。
@app.route('/webhook', methods=['POST'])
def webhook():
# Get JSON request
jsonRequest = request.get_json(silent=True, force=True)
# Call slow function and get the result
appResult = process_request(jsonRequest)
appResult = json.dumps(appResult, indent=4)
# Make a JSON response
jsonResponse = make_response(appResult)
jsonResponse.headers['Content-Type'] = 'application/json'
return jsonResponse
def process_request(req):
# Call a separate function here or do it all in this one (API Calls, processing etc)
# Return a value
return {
"version": "1.0",
"response": {
"shouldEndSession": True,
"outputSpeech": {
"type": "PlainText",
"text": "Return String"
},
"card": {
"type": "Simple",
"title": "Title",
"content": "Return String"
}
}
}
【问题讨论】:
-
也许可以试试
celery? -
如果你想尝试异步运行它,你应该试试asyncio,因为它是官方的。我个人尝试使用它,但发现它不支持我的需求,最终改为使用多线程,但它看起来非常强大。
-
11 不是比 10 大一个数量级。这是拼写错误还是您想减少 1 秒?
-
您可以将您的服务设计为订阅一个挂钩,该挂钩会在任务完成时收到通知。或者更骇人听闻的是,在收到执行任务的请求后,立即返回一个数字,指定一些请求 ID,然后不断 ping 服务直到完成。对此的比喻是在 DMV 排队时得到一个号码。此外,您应该确定您的瓶颈,因为如果您的任务本质上是串行的,那么您无法将其异步。
-
@Russley Shaw 这是一个非常有趣的想法!
标签: python api asynchronous