##// END OF EJS Templates
make Comm's publishing threadsafe...
Min RK -
Show More
@@ -3,8 +3,11 b''
3 # Copyright (c) IPython Development Team.
3 # Copyright (c) IPython Development Team.
4 # Distributed under the terms of the Modified BSD License.
4 # Distributed under the terms of the Modified BSD License.
5
5
6 import threading
6 import uuid
7 import uuid
7
8
9 from zmq.eventloop.ioloop import IOLoop
10
8 from IPython.config import LoggingConfigurable
11 from IPython.config import LoggingConfigurable
9 from IPython.kernel.zmq.kernelbase import Kernel
12 from IPython.kernel.zmq.kernelbase import Kernel
10
13
@@ -13,7 +16,7 b' from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any'
13
16
14
17
15 class Comm(LoggingConfigurable):
18 class Comm(LoggingConfigurable):
16
19 """Class for communicating between a Frontend and a Kernel"""
17 # If this is instantiated by a non-IPython kernel, shell will be None
20 # If this is instantiated by a non-IPython kernel, shell will be None
18 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC',
21 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC',
19 allow_none=True)
22 allow_none=True)
@@ -63,6 +66,10 b' class Comm(LoggingConfigurable):'
63
66
64 def _publish_msg(self, msg_type, data=None, metadata=None, buffers=None, **keys):
67 def _publish_msg(self, msg_type, data=None, metadata=None, buffers=None, **keys):
65 """Helper for sending a comm message on IOPub"""
68 """Helper for sending a comm message on IOPub"""
69 if threading.current_thread().name != 'MainThread' and IOLoop.initialized():
70 # make sure we never send on a zmq socket outside the main IOLoop thread
71 IOLoop.instance().add_callback(lambda : self._publish_msg(msg_type, data, metadata, buffers, **keys))
72 return
66 data = {} if data is None else data
73 data = {} if data is None else data
67 metadata = {} if metadata is None else metadata
74 metadata = {} if metadata is None else metadata
68 content = json_clean(dict(data=data, comm_id=self.comm_id, **keys))
75 content = json_clean(dict(data=data, comm_id=self.comm_id, **keys))
General Comments 0
You need to be logged in to leave comments. Login now