From e7eb7885ab33d30b226d266e36e6ecd052c3efa3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 14 Dec 2009 13:53:45 -0700 Subject: [PATCH] Add checkbox to control CPU limiting of worker processes --- src/calibre/gui2/__init__.py | 2 ++ src/calibre/gui2/dialogs/config/__init__.py | 2 ++ src/calibre/gui2/dialogs/config/config.ui | 35 ++++++++++++--------- src/calibre/gui2/dialogs/confirm_delete.py | 10 +++--- src/calibre/gui2/jobs.py | 3 +- src/calibre/utils/ipc/server.py | 5 +-- 6 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index b381d9ed56..7363498319 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -85,6 +85,8 @@ def _config(): help=_('Maximum number of waiting worker processes')) c.add_opt('get_social_metadata', default=True, help=_('Download social metadata (tags/rating/etc.)')) + c.add_opt('enforce_cpu_limit', default=True, + help=_('Limit max simultaneous jobs to number of CPUs')) return ConfigProxy(c) diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py index 4f84ae968c..2e647781c1 100644 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ b/src/calibre/gui2/dialogs/config/__init__.py @@ -456,6 +456,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): self.connect(self.button_open_config_dir, SIGNAL('clicked()'), self.open_config_dir) self.opt_get_social_metadata.setChecked(config['get_social_metadata']) + self.opt_enforce_cpu_limit.setChecked(config['enforce_cpu_limit']) def open_config_dir(self): from calibre.utils.config import config_dir @@ -742,6 +743,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): config['upload_news_to_device'] = self.sync_news.isChecked() config['search_as_you_type'] = self.search_as_you_type.isChecked() config['get_social_metadata'] = self.opt_get_social_metadata.isChecked() + config['enforce_cpu_limit'] = bool(self.opt_enforce_cpu_limit.isChecked()) fmts = [] for i in range(self.viewer.count()): if self.viewer.item(i).checkState() == Qt.Checked: diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui index 8f9c28aa8b..fc7c6b6635 100644 --- a/src/calibre/gui2/dialogs/config/config.ui +++ b/src/calibre/gui2/dialogs/config/config.ui @@ -15,7 +15,7 @@ Preferences - + :/images/config.svg:/images/config.svg @@ -90,7 +90,7 @@ 0 0 524 - 680 + 683 @@ -148,7 +148,7 @@ ... - + :/images/mimetypes/dir.svg:/images/mimetypes/dir.svg @@ -285,7 +285,7 @@ ... - + :/images/arrow-up.svg:/images/arrow-up.svg @@ -309,7 +309,7 @@ ... - + :/images/arrow-down.svg:/images/arrow-down.svg @@ -473,7 +473,7 @@ ... - + :/images/arrow-up.svg:/images/arrow-up.svg @@ -497,7 +497,7 @@ ... - + :/images/arrow-down.svg:/images/arrow-down.svg @@ -557,7 +557,7 @@ &Add email - + :/images/plus.svg:/images/plus.svg @@ -584,7 +584,7 @@ &Remove email - + :/images/minus.svg:/images/minus.svg @@ -649,27 +649,34 @@ - + &Check database integrity - + &Install command line tools - + Open calibre &configuration directory + + + + Limit the max. simultaneous jobs to the available CPU &cores + + + @@ -959,7 +966,7 @@ ... - + :/images/document_open.svg:/images/document_open.svg @@ -1030,7 +1037,7 @@ - + diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index 8c496987fb..42a1be41c0 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -11,22 +11,22 @@ def _config_name(name): return name + '_again' class Dialog(QDialog, Ui_Dialog): - + def __init__(self, msg, name, parent): QDialog.__init__(self, parent) self.setupUi(self) - + self.msg.setText(msg) self.name = name self.connect(self.again, SIGNAL('stateChanged(int)'), self.toggle) self.buttonBox.setFocus(Qt.OtherFocusReason) - + def toggle(self, x): dynamic[_config_name(self.name)] = self.again.isChecked() - + def confirm(msg, name, parent=None): if not dynamic.get(_config_name(name), True): return True d = Dialog(msg, name, parent) - return d.exec_() == d.Accepted \ No newline at end of file + return d.exec_() == d.Accepted diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 27b1f0ec54..a801e0db28 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -31,7 +31,8 @@ class JobManager(QAbstractTableModel): self.jobs = [] self.add_job = Dispatcher(self._add_job) - self.server = Server(limit=int(config['worker_limit']/2.0)) + self.server = Server(limit=int(config['worker_limit']/2.0), + enforce_cpu_limit=config['enforce_cpu_limit']) self.changed_queue = Queue() self.timer = QTimer(self) diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py index 4d2c4496bb..38d465cb78 100644 --- a/src/calibre/utils/ipc/server.py +++ b/src/calibre/utils/ipc/server.py @@ -84,14 +84,15 @@ class CriticalError(Exception): class Server(Thread): def __init__(self, notify_on_job_done=lambda x: x, pool_size=None, - limit=sys.maxint): + limit=sys.maxint, enforce_cpu_limit=True): Thread.__init__(self) self.daemon = True global _counter self.id = _counter+1 _counter += 1 - limit = min(limit, cpu_count()) + if enforce_cpu_limit: + limit = min(limit, cpu_count()) self.pool_size = limit if pool_size is None else pool_size self.notify_on_job_done = notify_on_job_done self.auth_key = os.urandom(32)