diff --git a/fsl/utils/async.py b/fsl/utils/async.py index 7ee46820da5566b1c345c5cf93ccad53014fad10..ef79513ca3ef454d301f29cd3d89e506b875f556 100644 --- a/fsl/utils/async.py +++ b/fsl/utils/async.py @@ -247,22 +247,30 @@ def _wxIdleLoop(ev): now = time.time() elapsed = now - task.schedtime queueSizeOffset = 0 + taskName = task.name + funcName = getattr(task.task, '__name__', '<unknown>') + + if taskName is None: taskName = funcName + else: taskName = '{} [{}]'.format(taskName, funcName) # Has enouggh time elapsed # since the task was scheduled? # If not, re-queue the task. if elapsed < task.after: - log.debug('Re-queueing function ({}) on wx idle ' - 'loop'.format(getattr(task.task, '__name__', '<unknown>'))) + log.debug('Re-queueing function ({}) on wx idle loop'.format(taskName)) _idleQueue.put_nowait(task) queueSizeOffset = 1 # Has the task timed out? elif task.timeout == 0 or (elapsed < task.timeout): - log.debug('Running function ({}) on wx idle ' - 'loop'.format(getattr(task.task, '__name__', '<unknown>'))) - task.task(*task.args, **task.kwargs) + log.debug('Running function ({}) on wx idle loop'.format(taskName)) + + try: + task.task(*task.args, **task.kwargs) + except Exception as e: + log.warning('Idle task {} crashed - {}: {}'.format( + taskName, type(e).__name__, str(e))) if task.name is not None: _idleQueueSet.discard(task.name) diff --git a/fsl/utils/notifier.py b/fsl/utils/notifier.py index c1a12e45d837ce09029ff60d43699c86d03ced04..5aef630dfa7bf802e1c9a0b70c78dc4d9def236b 100644 --- a/fsl/utils/notifier.py +++ b/fsl/utils/notifier.py @@ -14,7 +14,8 @@ import inspect import collections import props -import async + +import fsl.utils.async as async log = logging.getLogger(__name__)