switching to queue
diff --git a/src/buildstream/_scheduler/scheduler.py b/src/buildstream/_scheduler/scheduler.py
index e2a180c..77eca25 100644
--- a/src/buildstream/_scheduler/scheduler.py
+++ b/src/buildstream/_scheduler/scheduler.py
@@ -26,6 +26,7 @@
 import signal
 import datetime
 from contextlib import contextmanager
+import time
 
 # Local imports
 from .resources import Resources, ResourceType
@@ -95,7 +96,7 @@
 class Scheduler():
 
     def __init__(self, context,
-                 start_time, state, notification_handler,
+                 start_time, state, notification_queue, notifier,
                  interrupt_callback=None,
                  ticker_callback=None):
 
@@ -126,8 +127,9 @@
         self._cleanup_scheduled = False       # Whether we have a cleanup job scheduled
         self._cleanup_running = None          # A running CleanupJob, or None
 
-        # Callback to send notifications to report back to the Scheduler's owner
-        self.notify = notification_handler
+        # Message to send notifications back to the Scheduler's owner
+        self._notification_queue = notification_queue
+        self._notifier = notifier
 
         # Whether our exclusive jobs, like 'cleanup' are currently already
         # waiting or active.
@@ -294,7 +296,7 @@
                                     job_action=job.action_name,
                                     job_status=status,
                                     element=element)
-        self.notify(notification)
+        self._notify(notification)
         self._sched()
 
     # check_cache_size():
@@ -355,7 +357,7 @@
                                     full_name=job.name,
                                     job_action=job.action_name,
                                     elapsed_time=self.elapsed_time())
-        self.notify(notification)
+        self._notify(notification)
         job.start()
 
     # Callback for the cache size job
@@ -575,7 +577,7 @@
             return
 
         notification = Notification(NotificationType.INTERRUPT)
-        self.notify(notification)
+        self._notify(notification)
 
     # _terminate_event():
     #
@@ -635,9 +637,19 @@
     # Regular timeout for driving status in the UI
     def _tick(self):
         notification = Notification(NotificationType.TICK)
-        self.notify(notification)
+        self._notify(notification)
         self.loop.call_later(1, self._tick)
 
+    def _notify(self, notification):
+        self._notification_queue.put(notification)
+        x = 0
+        while self._notification_queue.empty():
+            time.sleep(0.1)
+            x = x +1
+            if x == 10:
+                raise ValueError("queue still empty")
+        self._notifier()
+
     def __getstate__(self):
         # The only use-cases for pickling in BuildStream at the time of writing
         # are enabling the 'spawn' method of starting child processes, and
diff --git a/src/buildstream/_stream.py b/src/buildstream/_stream.py
index c97cf28..ee5a48b 100644
--- a/src/buildstream/_stream.py
+++ b/src/buildstream/_stream.py
@@ -28,8 +28,10 @@
 import shutil
 import tarfile
 import tempfile
+import multiprocessing as mp
 from contextlib import contextmanager, suppress
 from fnmatch import fnmatch
+import queue
 
 from ._artifact import Artifact
 from ._artifactelement import verify_artifact_ref, ArtifactElement
@@ -80,10 +82,12 @@
         self._project = None
         self._pipeline = None
         self._state = State(session_start)  # Owned by Stream, used by Core to set state
+        self._notification_queue = mp.Queue()
 
         context.messenger.set_state(self._state)
 
-        self._scheduler = Scheduler(context, session_start, self._state, self._scheduler_notification_handler,
+        self._scheduler = Scheduler(context, session_start, self._state, self._notification_queue,
+                                    self._scheduler_notification_handler,
                                     interrupt_callback=interrupt_callback,
                                     ticker_callback=ticker_callback)
         self._first_non_track_queue = None
@@ -1586,7 +1590,16 @@
 
         return element_targets, artifact_refs
 
-    def _scheduler_notification_handler(self, notification):
+    def _scheduler_notification_handler(self):
+        # Check the queue is there and a scheduler is running
+        assert self._notification_queue
+        notification = None
+        #while notification is None:
+            #try:
+        notification = self._notification_queue.get_nowait()
+            #except queue.Empty:
+            #    pass
+
         if notification.notification_type == NotificationType.INTERRUPT:
             self._interrupt_callback()
         elif notification.notification_type == NotificationType.TICK: