【问题标题】:How do I get a fast return value while calling a slow function?如何在调用慢速函数时获得快速返回值?
【发布时间】: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


【解决方案1】:

这是如何解决的:

newThread = threading.Thread(target=api_processing_thread, args=[jsonRequest])

newThread.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多