【发布时间】: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 想要 Worker 的 data 而 Flask Web 服务器 只是两者之间的代理.
我希望在 Server 收到来自 Worker 的 data 后调用 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