mirror of
https://github.com/powerline/powerline.git
synced 2025-07-24 22:36:01 +02:00
Workaround deadlock in ipython
shutdown_hook is called after all non-daemon threads exit, but it is needed for them to exit. Thus I had to use daemon threads in ipython or find some hack to make .shutdown be called earlier.
This commit is contained in:
parent
27c9a05782
commit
878b808e9e
@ -36,7 +36,7 @@ def load_json_config(config_file_path, load=json.load, open_file=open_file):
|
|||||||
|
|
||||||
|
|
||||||
class PowerlineState(object):
|
class PowerlineState(object):
|
||||||
def __init__(self, logger, environ, getcwd, home):
|
def __init__(self, use_daemon_threads, logger, environ, getcwd, home):
|
||||||
self.environ = environ
|
self.environ = environ
|
||||||
self.getcwd = getcwd
|
self.getcwd = getcwd
|
||||||
self.home = home or environ.get('HOME', None)
|
self.home = home or environ.get('HOME', None)
|
||||||
@ -103,6 +103,7 @@ class Powerline(object):
|
|||||||
renderer_module=None,
|
renderer_module=None,
|
||||||
run_once=False,
|
run_once=False,
|
||||||
logger=None,
|
logger=None,
|
||||||
|
use_daemon_threads = False,
|
||||||
environ=os.environ,
|
environ=os.environ,
|
||||||
getcwd=getattr(os, 'getcwdu', os.getcwd),
|
getcwd=getattr(os, 'getcwdu', os.getcwd),
|
||||||
home=None):
|
home=None):
|
||||||
@ -114,6 +115,7 @@ class Powerline(object):
|
|||||||
self.environ = environ
|
self.environ = environ
|
||||||
self.getcwd = getcwd
|
self.getcwd = getcwd
|
||||||
self.home = home
|
self.home = home
|
||||||
|
self.use_daemon_threads = use_daemon_threads
|
||||||
|
|
||||||
self.config_paths = self.get_config_paths()
|
self.config_paths = self.get_config_paths()
|
||||||
|
|
||||||
@ -174,7 +176,7 @@ class Powerline(object):
|
|||||||
self.logger.setLevel(level)
|
self.logger.setLevel(level)
|
||||||
self.logger.addHandler(handler)
|
self.logger.addHandler(handler)
|
||||||
|
|
||||||
self.pl = PowerlineState(logger=self.logger, environ=self.environ, getcwd=self.getcwd, home=self.home)
|
self.pl = PowerlineState(self.use_daemon_threads, self.logger, self.environ, self.getcwd, self.home)
|
||||||
|
|
||||||
self.renderer_options = {
|
self.renderer_options = {
|
||||||
'term_truecolor': self.common_config.get('term_truecolor', False),
|
'term_truecolor': self.common_config.get('term_truecolor', False),
|
||||||
@ -234,6 +236,8 @@ class Powerline(object):
|
|||||||
**self.renderer_options)
|
**self.renderer_options)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.pl.exception('Failed to construct renderer object: {0}', str(e))
|
self.pl.exception('Failed to construct renderer object: {0}', str(e))
|
||||||
|
if not hasattr(self, 'renderer'):
|
||||||
|
raise
|
||||||
else:
|
else:
|
||||||
self.renderer = renderer
|
self.renderer = renderer
|
||||||
|
|
||||||
@ -351,6 +355,8 @@ class Powerline(object):
|
|||||||
'''Lock renderer from modifications and run its ``.shutdown()`` method.
|
'''Lock renderer from modifications and run its ``.shutdown()`` method.
|
||||||
'''
|
'''
|
||||||
self.shutdown_event.set()
|
self.shutdown_event.set()
|
||||||
|
if self.use_daemon_threads and self.is_alive():
|
||||||
|
self.thread.join()
|
||||||
with self.renderer_lock:
|
with self.renderer_lock:
|
||||||
self.renderer.shutdown()
|
self.renderer.shutdown()
|
||||||
|
|
||||||
@ -359,6 +365,8 @@ class Powerline(object):
|
|||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.thread = Thread(target=self.run)
|
self.thread = Thread(target=self.run)
|
||||||
|
if self.use_daemon_threads:
|
||||||
|
self.thread.daemon = True
|
||||||
self.thread.start()
|
self.thread.start()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -6,7 +6,7 @@ from powerline.lib import mergedicts
|
|||||||
|
|
||||||
class IpythonPowerline(Powerline):
|
class IpythonPowerline(Powerline):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(IpythonPowerline, self).__init__('ipython')
|
super(IpythonPowerline, self).__init__('ipython', use_daemon_threads=True)
|
||||||
|
|
||||||
def get_config_paths(self):
|
def get_config_paths(self):
|
||||||
if self.path:
|
if self.path:
|
||||||
|
@ -11,6 +11,7 @@ class ThreadedSegment(object):
|
|||||||
min_sleep_time = 0.1
|
min_sleep_time = 0.1
|
||||||
update_first = True
|
update_first = True
|
||||||
interval = 1
|
interval = 1
|
||||||
|
daemon = False
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ThreadedSegment, self).__init__()
|
super(ThreadedSegment, self).__init__()
|
||||||
@ -49,6 +50,7 @@ class ThreadedSegment(object):
|
|||||||
def start(self):
|
def start(self):
|
||||||
self.shutdown_event.clear()
|
self.shutdown_event.clear()
|
||||||
self.thread = Thread(target=self.run)
|
self.thread = Thread(target=self.run)
|
||||||
|
self.thread.daemon = self.daemon
|
||||||
self.thread.start()
|
self.thread.start()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@ -65,6 +67,8 @@ class ThreadedSegment(object):
|
|||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.shutdown_event.set()
|
self.shutdown_event.set()
|
||||||
|
if self.daemon and self.is_alive():
|
||||||
|
self.thread.join()
|
||||||
|
|
||||||
def set_interval(self, interval=None):
|
def set_interval(self, interval=None):
|
||||||
# Allowing “interval” keyword in configuration.
|
# Allowing “interval” keyword in configuration.
|
||||||
@ -81,6 +85,7 @@ class ThreadedSegment(object):
|
|||||||
def startup(self, pl, **kwargs):
|
def startup(self, pl, **kwargs):
|
||||||
self.run_once = False
|
self.run_once = False
|
||||||
self.pl = pl
|
self.pl = pl
|
||||||
|
self.daemon = pl.use_daemon_threads
|
||||||
|
|
||||||
self.set_state(**kwargs)
|
self.set_state(**kwargs)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user