<div dir="ltr">It is my understanding that the traitlets in most ipython notebook widgets aren't threadsafe.  If you're not sure what I mean, I attached a small example at the bottom of this note.<div><br></div><div>What's the best way for me to make a threadsafe widget?  I could inherit from DOMWidget and override a whole bunch of methods with a wrapper that puts things inside a threading.Lock, but it seems kinda like overkill.   I suppose theoretically you could lock all the traitlets & comms calls, but that also seems like overkill.  Or maybe not...I have no sense of proportion for these things.</div><div><br></div><div>The application is straightforward, maybe there's an easier way to do it.  </div><div><br></div><div>I'd like to be able to edit files from jupyterhub's host directly inside the notebook; CodeMirror is much more responsive than vim over ssh.  It was easy to make a text-editing widget based on codemirror, but I'd like to pop up a CodeMirror.dialog if somebody has changed the file being edited.  Can't figure out how to do that in a threadsafe way.</div><div><br></div><div>Happy Thursday!</div><div><br></div><div>Jackson Loper</div><div>Pattern Theory Group</div><div>Division of Applied Math</div><div>Brown University</div><div><br></div><div>====== threadsome danger =====<br><div><br></div><div>Running the latest github clone of jupyterhub, code like this is a very bad idea:</div><div><br></div><div><div>import IPython.display</div><div>from IPython.html import widgets, nbextensions</div><div>import threading</div><div>from numpy.random import randint</div><div>isw=widgets.IntSlider()</div><div>IPython.display.display(isw)</div><div>def randoset(N):</div><div>    for i in range(N):</div><div>        isw.value=randint(0,50)</div><div>t1=threading.Thread(target=randoset,args=[100])</div><div>t2=threading.Thread(target=randoset,args=[100])</div><div>t1.start()</div><div>t2.start()</div></div><div><br></div><div>The jupyterhub logs errors such as</div><div><br></div><div>Malformed message: [b'comm-....', b'<IDS|MSG>', b'comm-...', b'<IDS|MSG>', ... more stuff.. ]</div><div><br></div><div>Presumably two attempts at sending data over comms got mixeduptogether here, which is why we ended up with two <IDS_MSG> in one message!</div><div><br></div><div><br></div>







</div></div>