-
Notifications
You must be signed in to change notification settings - Fork 958
Description
Description
I create an Output object on the main thread and display something on it. Then, in another thread, I try to clear the output and display other things on it. There is a surprising race condition that causes some of the things in the new thread to not be displayed. Specifically, the call to out.clear_output() does not clear the output right away, so subsequent calls to the Output object will get dropped once clear_output finally takes effect.
Reproduce
From IPython notebook:
import string
import threading
from ipywidgets import Output
from IPython.display import display
import time
out = Output()
out.append_stdout('hello\n')
display(out)def bad_clear(out):
out.clear_output()
for c in string.ascii_letters:
out.append_stdout(c)
time.sleep(.01)
thread = threading.Thread(target=bad_clear, args=[out])
thread.start()For me, the output from the first cell can be jklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. abcdefghi got cleared!
To work around this, I currently do the following:
def good_clear(out):
out.clear_output()
while out.outputs:
time.sleep(0.01) # NEW
for c in string.ascii_letters:
out.append_stdout(c)
time.sleep(.01)
thread = threading.Thread(target=good_clear, args=[out])
thread.start()Expected behavior
I expect the output of out to be cleared in bad_clear immediately after out.clear_output() is called. If it's too troublesome to do this, then I at least expect a note in the docstring and the example added here: #1794
Context
Previous relevant issues: #1794 #1722 #1752
- ipywidgets version: 7.6.3