Browse code

exponentially decay message frequency in live_info

Jorn Hoofwijk authored on 20/09/2018 13:42:04 • Bas Nijholt committed on 22/10/2018 14:47:59
Showing 1 changed files
... ...
@@ -3,6 +3,7 @@ import importlib
3 3
 import asyncio
4 4
 from contextlib import suppress
5 5
 import datetime
6
+import random
6 7
 import warnings
7 8
 
8 9
 
... ...
@@ -150,6 +151,24 @@ def live_plot(runner, *, plotter=None, update_interval=2, name=None):
150 151
     return dm
151 152
 
152 153
 
154
+def should_update(status):
155
+    try:
156
+        # Get the length of the write buffer size
157
+        buffer_size = len(status.comm.kernel.iopub_thread._events)
158
+
159
+        # Make sure to only keep all the messages when the notebook
160
+        # is viewed, this means 'buffer_size == 1'. However, when not
161
+        # viewing the notebook the buffer fills up. When this happens
162
+        # we decide to only add messages to it when a certain probability.
163
+        # i.e. we're offline for 12h, with an update_interval of 0.5s,
164
+        # and without the reduced probability, we have buffer_size=86400.
165
+        # With the correction this is np.log(86400) / np.log(1.1) = 119.2
166
+        return 1.1**buffer_size * random.random() < 1
167
+    except Exception:
168
+        # We catch any Exception because we are using a private API.
169
+        return True
170
+
171
+
153 172
 def live_info(runner, *, update_interval=0.5):
154 173
     """Display live information about the runner.
155 174
 
... ...
@@ -172,7 +191,12 @@ def live_info(runner, *, update_interval=0.5):
172 191
     async def update():
173 192
         while not runner.task.done():
174 193
             await asyncio.sleep(update_interval)
175
-            status.value = _info_html(runner)
194
+
195
+            if should_update(status):
196
+                status.value = _info_html(runner)
197
+            else:
198
+                await asyncio.sleep(0.05)
199
+
176 200
         status.value = _info_html(runner)
177 201
         cancel.layout.display = 'none'
178 202