18.外部进程消息

优质
小牛编辑
134浏览
2023-12-01

对于许多类型的应用,从非服务端创建会话活动很有必要,例如一个Celery工作站。如果SocketIO服务器并没有按照前面章节那样配置监听队列,那么所有其它的进程可以像服务器那样创建它自己的SocketIO实例来创建消息活动。

例如,一个运行在eventlet网络服务器上的应用,使用了Redis消息队列,下面的Python脚本将向所有的客户端广播一个消息活动。

socketio=SocketIO(message_queue='redis://')
socketio.emit('my event', {'data': 'foo'}, namespace='/test')

当使用这种方法引用SocketIO实例,Flask应用实例将不会传递到构造函数。

当SocketIO通过消息队列使用参数channel来选择一个具体channel的对话。当很多独立的SocketIO服务公用一个队列的时候,使用一个自定义的channel名称将是很有必要的。

Flask-SocketIO并没有在使用eventlet或者gevent时应用猴子(monkey)来修补。但是当使用消息队列的时候,如果Python标准库没有使用猴子来修补,那么消息队列服务的Python包很可能会挂起。

很 重要的一点是:外部进程想连接到SocketIO服务器并不需要像主服务器那样使用eventlet或者gevent。使一个服务器使用了协同框架,外部 进程不是一个阻力。例如,Celery工作站并不需要配置使用eventlet或者gevent,是因为主服务器已经有了。但是,如果你的外部进程因为某 种原因
使用了协同框架,那么monkey修复就很可能是需要的,那么消息队列就可以获得协同友好的函数和类。