#!/usr/bin/env python from threading import Thread from subprocess import * from time import sleep, time import os, sys, traceback from Frame import Frame #path to CERTDemo.exe #CERT_PATH = '/home/ting/CERT/CERTWrapper/' CERT_PATH = '/home/asalamon/Public/CERT_CmdLine/CERT4_3_1/' class Worker(Thread): def __init__(self, name, job_queue, result_queue, readySignal): Thread.__init__(self, name=name) self.job_queue = job_queue self.result_queue = result_queue self.readySignal = readySignal def run(self): self.waitready(); self.pipe.stdin.write(os.getcwd()+'/face.jpg\n'); self.rawHeader = self.waitready() self.header=self.rawHeader[-2].strip().split('\t')[1:]; # header is output for first image only print self.getName(),'ready' self.readySignal.task_done() nextLoop = True while nextLoop: #get job frame = self.job_queue.get(); #blocking if frame is None: print "no more job, %s quit" % self.getName() self.pipe.stdin.write('quit\n'); nextLoop = False elif isinstance(frame, Frame): try: imgPath=frame.getImagePath() frame.putTimestamp('CERTStart'); frame.rawHeader = self.rawHeader frame.result = dict(zip(self.header,self.run_once(imgPath)[-1].strip().split('\t')[1:])); frame.putTimestamp('CERTEnd'); frame.worker = self.getName() self.result_queue.put(frame) except Exception, inst: # we failed, let others do that and we just quit traceback.print_tb(sys.exc_traceback) print inst self.job_queue.put(frame) print 'worker %s failed, quit.' % self.getName() nextLoop = False else: print 'What the fuck in the jobqueue:', frame nextLoop = False self.job_queue.task_done(); def waitready(self): msg = [] buf=self.pipe.stdout.readline() while "Enter" not in buf: msg.append(buf) buf=self.pipe.stdout.readline() return msg def run_once(self,imgPath): self.pipe.stdin.write(imgPath+'\n') msg = self.waitready() return msg class LocalWorker(Worker): def __init__(self, name, job_queue, result_queue, readySignal): Worker.__init__(self, name, job_queue, result_queue, readySignal) #start a copy of CERT program self.pipe = Popen(args=['./CERT', '-t'], cwd=CERT_PATH, stdin=PIPE, stdout=PIPE); class SSHWorker(Worker): def __init__(self, name, job_queue, result_queue,host, readySignal): Worker.__init__(self, name, job_queue, result_queue, readySignal) #start a copy of CERT program args= ['/usr/bin/ssh', host, 'cd %s; ./CERT -t' % CERT_PATH] self.pipe = Popen(args=args, stdin=PIPE, stdout=PIPE);