I have a Flask-SocketIO application. Can I safely call socketio.emit()
from different threads? Is socketio.emit()
atomic like the normal socket.send()
?

- 121,510
- 29
- 395
- 339

- 123
- 1
- 7
1 Answers
The socketio.emit()
function is thread safe, or I should say that it is intended to be thread-safe, as there is currently one open issue related to this. Note that 'thread' in this context means a supported threading model. Most people use Flask-SocketIO in conjunction with eventlet or gevent in production, so in those contexts thread means "green" thread.
The open issue is related to using a message queue, which is necessary when you have multiple servers. In that set up, the accesses to the queue are not thread safe at this time. This is a bug that needs to be fixed, but as a workaround, you can create a different socketio
object per thread.
On second question regarding if socketio.emit()
is atomic, the answer is no. This is not a simple socket write operation. The payload needs to be formatted in certain way to comply with the Socket.IO protocol, then depending on the selected transport (long-polling or websocket) the write happens in a completely different way.

- 65,299
- 14
- 133
- 152