【问题标题】:How to wait for a callback passed to Flask-SocketIO's emit()?如何等待传递给 Flask-SocketIO 的 emit() 的回调?
【发布时间】:2017-09-21 09:12:59
【问题描述】:

Flask-SocketIO 中有没有办法让 阻塞/同步 emit('event', callback) 函数在返回之前等待传递给它的回调

或者——有没有办法直接@socketio.on('event')处理程序中调用回调,而不是从普通的return那个处理程序?


这是我的具体情况:

+-----------------+                            +----------------------+                         +----------------------+
|     Browser     |  emit('serverGiveData',    |        Flask         |  emit('workerGiveData', |       Worker         |
|  (webapp, JS)   |       browser_callback)    |      web server      |       server_callback)  |   (Python program)   |
|                 | +------------------------> |                      | +-------------------->  |                      |
|                 |                            |                      |                         |                      |
| socket.io 1.7.3 |            data            | Flask-SocketIO 2.8.2 |          data           |socketiIO-client 0.7.2|
|                 | <------------------------+ |                      | <--------------------+  |                      |
|                 |                            |                      |                         |                      |
+-----------------+                            +----------------------+                         +----------------------+

所以 Browser 想要 WorkerdataFlask Web 服务器 只是两者之间的代理.

我希望在 Server 收到来自 Workerdata 后调用 browser_callback()
(即我想从server_callback() 拨打browser_callback())。

但是,我无法在 Flask-SocketIO 中手动从 server_callback() 调用 browser_callback() - 当我从 'serverGiveData' 返回时“自动”调用它服务器上的处理函数。这就是为什么我想要一个 阻塞/同步 emit('workerGiveData') 以便 Server 上的处理程序不会在 Worker 之前返回传递数据。


这是代码

浏览器

socketio.emit('serverGiveData', args, function (data) {
    console.log('Received data');
});

服务器

@socketio.on('serverGiveData')
def handler(msg):
    socketio.emit('workerGiveData', msg, callback=server_callback)
    return  # When server_callback() gets called back

def server_callback(data):
    print('Received data from Worker')
    # Here I want to invoke client_callback(), i.e.
    # I don't want handler() to return before this server_callback() is invoked

工人

def handler(args, callback);
    callback(data)

socketIO.on('workerGiveData', handler)

(我知道当 Worker 传递数据并使用 browser_callback() 代码作为处理程序在浏览器中侦听该事件时,我可以从 server_callback()emit('heyBrowserHeresData')
我想避免这种混乱。)

【问题讨论】:

    标签: flask callback socket.io blocking flask-socketio


    【解决方案1】:

    Socket.IO 协议是基于事件的,而不是基于请求/响应的。我建议您不要使用回调,这些回调是为了快速确认收到事件,而不是在完成某些工作后提供结果。

    尝试使用新事件来替换您的回调:

    +-----------------+                            +----------------------+                         +----------------------+
    |     Browser     |  emit('serverGiveData’)    |        Flask         |  emit('workerGiveData', |       Worker         |
    |  (webapp, JS)   |                            |      web server      |       server_callback)  |   (Python program)   |
    |                 | +------------------------> |                      | +-------------------->  |                      |
    |                 |                            |                      |                         |                      |
    | socket.io 1.7.3 |  emit(‘dataForBrowser’)    | Flask-SocketIO 2.8.2 |          data           |socketiIO-client 0.7.2|
    |                 | <------------------------+ |                      | <--------------------+  |                      |
    |                 |                            |                      |                         |                      |
    +-----------------+                            +----------------------+                         +----------------------+
    

    如果这对您很有效,您可以将第二个回调留在服务器端,或者您也可以将其替换为事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多