From 468ac27782183220b35d2c9fb919a8bc0d606ffd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 23 Mar 2011 14:52:34 -0600 Subject: [PATCH] OSX and Linux: Add a setting in Preferences->Behavior to control the priority with which calibre worker processes run. Fixes #741231 (calibre-parallel process priority) --- src/calibre/gui2/preferences/behavior.py | 11 +++++------ src/calibre/utils/ipc/launch.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/preferences/behavior.py b/src/calibre/gui2/preferences/behavior.py index 45a63ce529..342b5197c9 100644 --- a/src/calibre/gui2/preferences/behavior.py +++ b/src/calibre/gui2/preferences/behavior.py @@ -31,9 +31,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): db = gui.library_view.model().db r = self.register - - r('worker_process_priority', prefs, choices= - [(_('Low'), 'low'), (_('Normal'), 'normal'), (_('High'), 'high')]) + choices = [(_('Low'), 'low'), (_('Normal'), 'normal'), (_('High'), + 'high')] if iswindows else \ + [(_('Normal'), 'normal'), (_('Low'), 'low'), (_('Very low'), + 'high')] + r('worker_process_priority', prefs, choices=choices) r('network_timeout', prefs) @@ -60,9 +62,6 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): signal = getattr(self.opt_internally_viewed_formats, 'item'+signal) signal.connect(self.internally_viewed_formats_changed) - self.settings['worker_process_priority'].gui_obj.setVisible(iswindows) - self.priority_label.setVisible(iswindows) - def initialize(self): ConfigWidgetBase.initialize(self) diff --git a/src/calibre/utils/ipc/launch.py b/src/calibre/utils/ipc/launch.py index bc7927aa11..70be0ceb0d 100644 --- a/src/calibre/utils/ipc/launch.py +++ b/src/calibre/utils/ipc/launch.py @@ -7,6 +7,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import subprocess, os, sys, time, binascii, cPickle +from functools import partial from calibre.constants import iswindows, isosx, isfrozen from calibre.utils.config import prefs @@ -19,6 +20,12 @@ if iswindows: except: raise RuntimeError('NUL %r file missing in windows'%os.devnull) +def renice(niceness): + try: + os.nice(niceness) + except: + pass + class Worker(object): ''' Platform independent object for launching child processes. All processes @@ -144,6 +151,13 @@ class Worker(object): 'normal' : win32process.NORMAL_PRIORITY_CLASS, 'low' : win32process.IDLE_PRIORITY_CLASS}[priority] args['creationflags'] = win32process.CREATE_NO_WINDOW|priority + else: + niceness = { + 'normal' : 0, + 'low' : 10, + 'high' : 20, + }[priority] + args['preexec_fn'] = partial(renice, niceness) ret = None if redirect_output: self._file = PersistentTemporaryFile('_worker_redirect.log')