[IPython-dev] Output from background threads in notebook?
benjaminrk at gmail.com
Fri Mar 21 19:44:51 EDT 2014
On Sun, Mar 16, 2014 at 6:30 PM, Doug Blank <doug.blank at gmail.com> wrote:
> If you run the following cell:
> import threading
> import time
> class ThreadClass(threading.Thread):
> def run(self):
> x = 1
> while True:
> x += 1
> t = ThreadClass()
> Then you will see the data for as long as you don't interrupt the
> cell. If you comment out the t.join(), then you won't see any output
> (or maybe just the first printed).
> In the next cell, if you do something such as, say:
> while True:
> and then interrupt the kernel, you'll see some more of the printouts.
> It appears that when the execution_reply is received, the notebook
> doesn't take output messages anymore. Is this all by design? Is there
> a manner to make sure background-running output can still make its way
> to the notebook?
zmq sockets are not threadsafe. To protect against segfaults, background
threads are not allowed to write directly to the IOPub socket. What they do
instead is write to a buffer, which the main thread checks periodically.
That's why async output from a thread doesn't show up until there is some
interaction in the main thread.
It would be easy enough to hook up that checking / flushing to the main
eventloop, in which case it would still be threadsafe, but still allow
publication while the kernel is idle. But that's now how it works right now.
> IPython-dev mailing list
> IPython-dev at scipy.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the IPython-dev