【问题标题】:python flask: asynchronous requestspython flask:异步请求
【发布时间】:2018-11-01 15:07:34
【问题描述】:

在烧瓶视图中,我通过 API 调用接收数据,这些数据必须传递给有时非常慢的外部 API。

所以我希望视图在异步处理请求时返回一个肯定的状态代码。

我已经尝试过 requests-futures 并且在回调方面遇到了困难:

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 秒后调用回调函数。

提前谢谢你!

【问题讨论】:

  • requests-futures 不会通过单个 API 调用帮助您。另外,在 3 秒等待期间,除了 200 之外,您还会返回什么?
  • 还是调用者只需要知道你收到了请求,并没有实际的数据返回给他们?
  • 完全正确。调用者只需要知道数据已经被传递。总是 200。
  • 回调函数会有更多的业务逻辑...

标签: python flask requests-futures


【解决方案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()

如果您需要特定的异步处理,也可以使用rqcelery

希望这会有所帮助。

【讨论】:

  • 我尝试了你的代码,但运行时错误“get() got an unexpected keyword argument 'background_callback'”
  • @Zvi 尝试更新packagecheck 添加 background_callback 时。
  • 在更新得到background_callback 后已弃用并将在1.0 中删除,请改用hooks,但这次程序并没有崩溃。切换到“钩子”,它没有任何错误或警告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多