class JobWorker(threading.Thread): def __init__(self, cb, sensor_id, result_queue): super(JobWorker, self).__init__() self.cb = cb self.sensor_id = sensor_id self.job_queue = Queue() self.lr_session = None self.result_queue = result_queue def run(self): try: self.lr_session = self.cb.live_response.request_session(self.sensor_id) self.result_queue.put(WorkerStatus(self.sensor_id, status="ready")) while True: work_item = self.job_queue.get(block=True) if not work_item: self.job_queue.task_done() return self.run_job(work_item) self.result_queue.put(CompletionNotification(self.sensor_id)) self.job_queue.task_done() except Exception as e: self.result_queue.put(WorkerStatus(self.sensor_id, status="error", exception=e)) finally: if self.lr_session: self.lr_session.close() self.result_queue.put(WorkerStatus(self.sensor_id, status="exiting")) def run_job(self, work_item): try: work_item.future.set_result(work_item.fn(self.lr_session)) except Exception as e: work_item.future.set_exception(e)
class JobWorker(threading.Thread): """Thread object that executes individual Live Response jobs.""" def __init__(self, cb, sensor_id, result_queue): """ Initialize the JobWorker. Args: cb (BaseAPI): The CBAPI object reference. sensor_id (int): The ID of the sensor being used. result_queue (Queue): The queue where results are placed. """ super(JobWorker, self).__init__() self.cb = cb self.sensor_id = sensor_id self.job_queue = Queue() self.lr_session = None self.result_queue = result_queue def run(self): """Execute the job worker.""" try: self.lr_session = self.cb.live_response.request_session( self.sensor_id) self.result_queue.put(WorkerStatus(self.sensor_id, status="ready")) while True: work_item = self.job_queue.get(block=True) if not work_item: self.job_queue.task_done() return self.run_job(work_item) self.result_queue.put(CompletionNotification(self.sensor_id)) self.job_queue.task_done() except Exception as e: self.result_queue.put( WorkerStatus(self.sensor_id, status="error", exception=e)) finally: if self.lr_session: self.lr_session.close() self.result_queue.put( WorkerStatus(self.sensor_id, status="exiting")) def run_job(self, work_item): """ Execute an individual WorkItem. Args: work_item (WorkItem): The work item to execute. """ try: work_item.future.set_result(work_item.fn(self.lr_session)) except Exception as e: work_item.future.set_exception(e)