From 5a15b0e20c16fc60b147bc0144a989665b47b035 Mon Sep 17 00:00:00 2001 From: David Baddeley Date: Tue, 16 Feb 2021 13:48:24 +1300 Subject: [PATCH 1/2] delay signalling of series completion until after events have been written. --- PYME/Acquire/HDFSpooler.py | 5 ++--- PYME/Acquire/HTTPSpooler.py | 4 +--- PYME/Acquire/SpoolController.py | 2 +- PYME/Acquire/Spooler.py | 12 ++++++++++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/PYME/Acquire/HDFSpooler.py b/PYME/Acquire/HDFSpooler.py index d16dc8542..ff01e9fbd 100755 --- a/PYME/Acquire/HDFSpooler.py +++ b/PYME/Acquire/HDFSpooler.py @@ -110,9 +110,8 @@ def __init__(self, filename, frameSource, frameShape, complevel=6, complib='zlib sp.Spooler.__init__(self, filename, frameSource, **kwargs) - def StopSpool(self): - """Stop spooling and close file""" - sp.Spooler.StopSpool(self) + def finalise(self): + """ close files""" self.h5File.flush() self.h5File.close() diff --git a/PYME/Acquire/HTTPSpooler.py b/PYME/Acquire/HTTPSpooler.py index be8a76db1..cd2135740 100644 --- a/PYME/Acquire/HTTPSpooler.py +++ b/PYME/Acquire/HTTPSpooler.py @@ -236,9 +236,7 @@ def StartSpool(self): else: clusterIO.put_file(self.seriesName + '/metadata.json', self.md.to_JSON().encode(), serverfilter=self.clusterFilter) - def StopSpool(self): - sp.Spooler.StopSpool(self) - + def finalise(self): # wait until our input queue is empty rather than immediately stopping saving. self._stopping=True logger.debug('Stopping spooling %s' % self.seriesName) diff --git a/PYME/Acquire/SpoolController.py b/PYME/Acquire/SpoolController.py index ad053e08c..cde07e6eb 100644 --- a/PYME/Acquire/SpoolController.py +++ b/PYME/Acquire/SpoolController.py @@ -470,7 +470,7 @@ def StartSpooling(self, fn=None, stack=None, compLevel=None, self.onSpoolStart.send(self) #return a function which can be called to indicate if we are done - return lambda : not self.spooler.spoolOn + return lambda : self.spooler.spool_complete @property def display_dirname(self): diff --git a/PYME/Acquire/Spooler.py b/PYME/Acquire/Spooler.py index 6d46e2696..99ad35ca6 100755 --- a/PYME/Acquire/Spooler.py +++ b/PYME/Acquire/Spooler.py @@ -114,6 +114,8 @@ def __init__(self, filename, frameSource, protocol = p.NullProtocol, self.spoolOn = False self.imNum = 0 + self.spool_complete = False + self._spooler_uuid = uuid.uuid4() if not fakeCamCycleTime is None: @@ -172,6 +174,16 @@ def StopSpool(self): self.onSpoolStop.send(self) + self.finalise() #TODO - should this be before we send the onStopSpool signal? + self.spool_complete = True + + def finalise(self): + """ + Over-ride in derived classes to do any spooler specific tidy up - e.g. sending events to server + + """ + pass + def abort(self): """ Tidy up if something goes horribly wrong. Disconnects frame source and event logger and then calls cleanup() From eb80684667d712bfed54b068927d677c1df21f52 Mon Sep 17 00:00:00 2001 From: David Baddeley Date: Tue, 16 Feb 2021 13:52:48 +1300 Subject: [PATCH 2/2] improve startLog, stopLog naming --- PYME/Acquire/Spooler.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PYME/Acquire/Spooler.py b/PYME/Acquire/Spooler.py index 99ad35ca6..39006ec69 100755 --- a/PYME/Acquire/Spooler.py +++ b/PYME/Acquire/Spooler.py @@ -138,7 +138,7 @@ def StartSpool(self): self.protocol.Init(self) - self.doStartLog() + self._collect_start_metadata() self.frameSource.connect(self.OnFrame, dispatch_uid=self._spooler_uuid) self.spoolOn = True @@ -158,7 +158,7 @@ def StopSpool(self): try: self.protocol.OnFinish()#this may still cause events self.FlushBuffer() - self.doStopLog() + self._collect_stop_metadata() except: import traceback traceback.print_exc() @@ -237,7 +237,7 @@ def OnFrame(self, **kwargs): self.StopSpool() - def doStartLog(self): + def _collect_start_metadata(self): """Record pertinant information to metadata at start of acquisition. Loops through all registered sources of start metadata and adds their entries. @@ -265,7 +265,7 @@ def doStartLog(self): self.md.copyEntriesFrom(mdt) - def doStopLog(self): + def _collect_stop_metadata(self): """Record information to metadata at end of acquisition""" self.md.setEntry('EndTime', time.time())