def worker_main(conn): from importlib import import_module common_data = None while True: try: job = pickle_loads(eintr_retry_call(conn.recv_bytes)) except EOFError: break except KeyboardInterrupt: break except Exception: prints('recv() failed in worker, terminating worker', file=sys.stderr) import traceback traceback.print_exc() return 1 if job is None: break if not isinstance(job, Job): if isinstance(job, File): with lopen(job.name, 'rb') as f: common_data = f.read() common_data = pickle_loads(common_data) else: common_data = job continue try: if '\n' in job.module: import_module('calibre.customize.ui') # Load plugins from calibre.utils.ipc.simple_worker import compile_code mod = compile_code(job.module) func = mod[job.func] else: func = getattr(import_module(job.module), job.func) if common_data is not None: job.kwargs['common_data'] = common_data result = func(*job.args, **job.kwargs) result = Result(result, None, None) except Exception as err: import traceback result = Result(None, as_unicode(err), traceback.format_exc()) try: eintr_retry_call(conn.send_bytes, pickle_dumps(result)) except EOFError: break except Exception: prints('send() failed in worker, terminating worker', file=sys.stderr) import traceback traceback.print_exc() return 1 return 0
def worker_main(conn): from importlib import import_module common_data = None while True: try: job = pickle_loads(eintr_retry_call(conn.recv_bytes)) except EOFError: break except KeyboardInterrupt: break except Exception: prints('recv() failed in worker, terminating worker', file=sys.stderr) import traceback traceback.print_exc() return 1 if job is None: break if not isinstance(job, Job): if isinstance(job, File): with lopen(job.name, 'rb') as f: common_data = f.read() common_data = pickle_loads(common_data) else: common_data = job continue try: if '\n' in job.module: import_module('calibre.customize.ui') # Load plugins from calibre.utils.ipc.simple_worker import compile_code mod = compile_code(job.module) func = mod[job.func] else: func = getattr(import_module(job.module), job.func) if common_data is not None: job.kwargs['common_data'] = common_data result = func(*job.args, **job.kwargs) result = Result(result, None, None) except Exception as err: import traceback result = Result(None, as_unicode(err), traceback.format_exc()) try: eintr_retry_call(conn.send_bytes, pickle_dumps(result)) except EOFError: break except Exception: prints('send() failed in worker, terminating worker', file=sys.stderr) import traceback traceback.print_exc() return 1 return 0
def recv(self): try: result = pickle_loads(eintr_retry_call(self.conn.recv_bytes)) wr = WorkerResult(self.job_id, result, False, self) except Exception as err: import traceback result = Result(None, as_unicode(err), traceback.format_exc()) wr = WorkerResult(self.job_id, result, True, self) self.events.put(wr)
def recv(self): try: result = pickle_loads(eintr_retry_call(self.conn.recv_bytes)) wr = WorkerResult(self.job_id, result, False, self) except Exception as err: import traceback result = Result(None, as_unicode(err), traceback.format_exc()) wr = WorkerResult(self.job_id, result, True, self) self.events.put(wr)
def read_old_serialized_representation(self): from calibre.utils.shared_file import share_open from calibre.utils.serialize import pickle_loads path = self.file_path.rpartition('.')[0] try: with share_open(path, 'rb') as f: raw = f.read() except EnvironmentError: raw = b'' try: d = pickle_loads(raw).copy() except Exception: d = {} return d
def read_old_serialized_representation(self): from calibre.utils.shared_file import share_open from calibre.utils.serialize import pickle_loads path = self.file_path.rpartition('.')[0] try: with share_open(path, 'rb') as f: raw = f.read() except EnvironmentError: raw = b'' try: d = pickle_loads(raw).copy() except Exception: d = {} return d
def run(self): while True: try: job = self.add_jobs_queue.get(True, 0.2) if job is None: break self.waiting_jobs.insert(0, job) except Empty: pass # Get notifications from worker process for worker in self.workers: while True: try: n = worker.notifications.get_nowait() worker.job.notifications.put(n) self.changed_jobs_queue.put(worker.job) except Empty: break # Remove finished jobs for worker in [w for w in self.workers if not w.is_alive]: try: worker.close_log_file() except: pass self.workers.remove(worker) job = worker.job if worker.returncode != 0: job.failed = True job.returncode = worker.returncode elif os.path.exists(worker.rfile): try: with lopen(worker.rfile, 'rb') as f: job.result = pickle_loads(f.read()) os.remove(worker.rfile) except: pass job.duration = time.time() - job.start_time self.changed_jobs_queue.put(job) # Start waiting jobs sj = self.suitable_waiting_job() if sj is not None: job = self.waiting_jobs.pop(sj) job.start_time = time.time() if job.kill_on_start: job.duration = 0.0 job.returncode = 1 job.killed = job.failed = True job.result = None else: worker = self.launch_worker() worker.start_job(job) self.workers.append(worker) job.log_path = worker.log_path self.changed_jobs_queue.put(job) while True: try: j = self.kill_queue.get_nowait() self._kill_job(j) except Empty: break
def run(self): while True: try: job = self.add_jobs_queue.get(True, 0.2) if job is None: break self.waiting_jobs.insert(0, job) except Empty: pass # Get notifications from worker process for worker in self.workers: while True: try: n = worker.notifications.get_nowait() worker.job.notifications.put(n) self.changed_jobs_queue.put(worker.job) except Empty: break # Remove finished jobs for worker in [w for w in self.workers if not w.is_alive]: try: worker.close_log_file() except: pass self.workers.remove(worker) job = worker.job if worker.returncode != 0: job.failed = True job.returncode = worker.returncode elif os.path.exists(worker.rfile): try: with lopen(worker.rfile, 'rb') as f: job.result = pickle_loads(f.read()) os.remove(worker.rfile) except: pass job.duration = time.time() - job.start_time self.changed_jobs_queue.put(job) # Start waiting jobs sj = self.suitable_waiting_job() if sj is not None: job = self.waiting_jobs.pop(sj) job.start_time = time.time() if job.kill_on_start: job.duration = 0.0 job.returncode = 1 job.killed = job.failed = True job.result = None else: worker = self.launch_worker() worker.start_job(job) self.workers.append(worker) job.log_path = worker.log_path self.changed_jobs_queue.put(job) while True: try: j = self.kill_queue.get_nowait() self._kill_job(j) except Empty: break