Skip to content

Commit 3eac532

Browse files
Added "ignore_queue" option to bypass message queue in emits
1 parent 749f866 commit 3eac532

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

socketio/base_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def get_rooms(self, sid, namespace):
113113
return r
114114

115115
def emit(self, event, data, namespace, room=None, skip_sid=None,
116-
callback=None):
116+
callback=None, **kwargs):
117117
"""Emit a message to a single client, a room, or all the clients
118118
connected to the namespace."""
119119
if namespace not in self.rooms or room not in self.rooms[namespace]:

socketio/pubsub_manager.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def initialize(self, server):
3737
self.server.logger.info(self.name + ' backend initialized.')
3838

3939
def emit(self, event, data, namespace=None, room=None, skip_sid=None,
40-
callback=None):
40+
callback=None, **kwargs):
4141
"""Emit a message to a single client, a room, or all the clients
4242
connected to the namespace.
4343
@@ -46,6 +46,10 @@ def emit(self, event, data, namespace=None, room=None, skip_sid=None,
4646
4747
The parameters are the same as in :meth:`.Server.emit`.
4848
"""
49+
if kwargs.get('ignore_queue'):
50+
return super(PubSubManager, self).emit(
51+
event, data, namespace=namespace, room=room, skip_sid=skip_sid,
52+
callback=callback)
4953
namespace = namespace or '/'
5054
if callback is not None:
5155
if self.server is None:

socketio/server.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def register_namespace(self, namespace_handler):
177177
namespace_handler
178178

179179
def emit(self, event, data=None, room=None, skip_sid=None, namespace=None,
180-
callback=None):
180+
callback=None, **kwargs):
181181
"""Emit a custom event to one or more connected clients.
182182
183183
:param event: The event name. It can be any string. The event names
@@ -202,14 +202,22 @@ def emit(self, event, data=None, room=None, skip_sid=None, namespace=None,
202202
that will be passed to the function are those provided
203203
by the client. Callback functions can only be used
204204
when addressing an individual client.
205+
:param ignore_queue: Only used when a message queue is configured. If
206+
set to ``True``, the event is emitted to the
207+
clients directly, without going through the queue.
208+
This is more efficient, but only works when a
209+
single server process is used. It is recommended
210+
to always leave this parameter with its default
211+
value of ``False``.
205212
"""
206213
namespace = namespace or '/'
207214
self.logger.info('emitting event "%s" to %s [%s]', event,
208215
room or 'all', namespace)
209-
self.manager.emit(event, data, namespace, room, skip_sid, callback)
216+
self.manager.emit(event, data, namespace, room, skip_sid, callback,
217+
**kwargs)
210218

211219
def send(self, data, room=None, skip_sid=None, namespace=None,
212-
callback=None):
220+
callback=None, **kwargs):
213221
"""Send a message to one or more connected clients.
214222
215223
This function emits an event with the name ``'message'``. Use
@@ -234,8 +242,16 @@ def send(self, data, room=None, skip_sid=None, namespace=None,
234242
that will be passed to the function are those provided
235243
by the client. Callback functions can only be used
236244
when addressing an individual client.
245+
:param ignore_queue: Only used when a message queue is configured. If
246+
set to ``True``, the event is emitted to the
247+
clients directly, without going through the queue.
248+
This is more efficient, but only works when a
249+
single server process is used. It is recommended
250+
to always leave this parameter with its default
251+
value of ``False``.
237252
"""
238-
self.emit('message', data, room, skip_sid, namespace, callback)
253+
self.emit('message', data, room, skip_sid, namespace, callback,
254+
**kwargs)
239255

240256
def enter_room(self, sid, room, namespace=None):
241257
"""Enter a room.

tests/test_pubsub_manager.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ def test_emit_with_callback_missing_room(self):
8585
self.assertRaises(ValueError, self.pm.emit, 'foo', 'bar',
8686
callback='cb')
8787

88+
def test_emit_with_ignore_queue(self):
89+
self.pm.connect('123', '/')
90+
self.pm.emit('foo', 'bar', room='123', namespace='/',
91+
ignore_queue=True)
92+
self.pm._publish.assert_not_called()
93+
self.pm.server._emit_internal.assert_called_once_with('123', 'foo',
94+
'bar', '/', None)
95+
8896
def test_close_room(self):
8997
self.pm.close_room('foo')
9098
self.pm._publish.assert_called_once_with(

0 commit comments

Comments
 (0)