def Process(self, fr): if self.infoemitted: if fr.type == G3FrameType.PipelineInfo and \ self.originalpi is not None and \ self.originalpi == list(fr.keys()): # Deduplicate PipelineInfo frames identical to one that we # added to earlier, which avoids false semi-duplicates down # the line when processing multiple files. return False return fr # Allow limited reordering of metadata if fr.type in [ G3FrameType.Observation, G3FrameType.Wiring, G3FrameType.Calibration ]: self.buffer.append(fr) return [] self.infoemitted = True if fr.type == G3FrameType.PipelineInfo: self.originalpi = list(fr.keys()) fr[str(G3Time.Now())] = self.pipelineinfo self.buffer.append(fr) else: self.originalpi = None f = G3Frame(G3FrameType.PipelineInfo) f[str(G3Time.Now())] = self.pipelineinfo self.buffer += [f, fr] rv = self.buffer del self.buffer return rv
def test_put_get_delete(self): frame = G3Frame() self.assertEqual(frame.keys(), []) frame["key1"] = "val1" self.assertEqual(frame["key1"], "val1") del frame["key1"] with self.assertRaises(KeyError): frame["key1"]
def test_len(self): frame = G3Frame() self.assertEqual(len(frame), 0) frame["key1"] = "val1" frame["key2"] = "val2" self.assertEqual(len(frame), 2) del frame["key1"] del frame["key2"] self.assertEqual(len(frame), 0)
def test_values(self): frame = G3Frame() self.assertEqual(frame.keys(), []) frame["key1"] = "val1" frame["key2"] = "val2" keys = [] vals = [] self.assertTrue("val1" in frame.values()) self.assertTrue("val2" in frame.values()) del frame["key1"] del frame["key2"] self.assertTrue("val1" not in frame.values())
def test_iter(self): frame = G3Frame() self.assertEqual(frame.keys(), []) frame["key1"] = "val1" frame["key2"] = "val2" keys = [] for key in frame: keys.append(key) self.assertEqual(len(keys), 2) self.assertTrue("key1" in keys) self.assertTrue("key2" in keys)
def test_iteritems(self): frame = G3Frame() self.assertEqual(frame.keys(), []) frame["key1"] = "val1" frame["key2"] = "val2" keys = [] vals = [] for k, v in frame.iteritems(): keys.append(k) vals.append(v) self.assertEqual(len(keys), 2) self.assertEqual(len(vals), 2) self.assertTrue("key1" in keys) self.assertTrue("key2" in keys) self.assertTrue("val1" in vals) self.assertTrue("val2" in vals)
def run(self): # Processing flow in worker process: # - Receive data from the remote end (blocking) # - Process data # - Return results, packaged as a list of frames # # Note that this must return *something* in response to every # frame to keep the outstanding frame accounting in the master # process working (an empty list is fine). while True: framelen = struct.unpack('i', self.queue[1].recv(4))[0] framebuf = b'' while len(framebuf) < framelen: framebuf += self.queue[1].recv(framelen - len(framebuf)) frame = G3Frame() frame.__setstate__(({}, framebuf)) outframes = self.targetmod(frame) if outframes is None: out = [frame] elif isinstance(outframes, G3Frame): out = [outframes] elif hasattr(outframes, '__iter__'): out = list(outframes) elif outframes: out = [frame] else: out = [] outbuf = pickle.dumps(out) outbuf = struct.pack('i', len(outbuf)) + outbuf self.queue[1].send(outbuf) if frame.type == G3FrameType.EndProcessing: return