From 03dc0060aa335c029d7ac4ec33e7aa63b3b8ef9f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 14 Aug 2010 13:29:53 -0600 Subject: [PATCH] When converting comics, run only a single conversion job at a time, since comic conversion uses all CPU cores anyway --- src/calibre/utils/ipc/server.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py index 38d465cb78..6ac8df7a24 100644 --- a/src/calibre/utils/ipc/server.py +++ b/src/calibre/utils/ipc/server.py @@ -103,7 +103,7 @@ class Server(Thread): authkey=self.auth_key, backlog=4) self.add_jobs_queue, self.changed_jobs_queue = Queue(), Queue() self.kill_queue = Queue() - self.waiting_jobs, self.processing_jobs = deque(), deque() + self.waiting_jobs, self.processing_jobs = [], deque() self.pool, self.workers = deque(), deque() self.launched_worker_count = 0 self._worker_launch_lock = RLock() @@ -167,7 +167,7 @@ class Server(Thread): job = self.add_jobs_queue.get(True, 0.2) if job is None: break - self.waiting_jobs.append(job) + self.waiting_jobs.insert(0, job) except Empty: pass @@ -202,8 +202,9 @@ class Server(Thread): pass # Start waiting jobs - if len(self.pool) > 0 and len(self.waiting_jobs) > 0: - job = self.waiting_jobs.pop() + 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 @@ -224,6 +225,17 @@ class Server(Thread): except Empty: break + def suitable_waiting_job(self): + available_workers = len(self.pool) + if available_workers == 0: + return None + for i, job in enumerate(self.waiting_jobs): + if job.core_usage == -1: + if available_workers >= self.pool_size: + return i + elif job.core_usage <= available_workers: + return i + def kill_job(self, job): self.kill_queue.put(job)