Source code for traits_futures.wrappers
# (C) Copyright 2018-2024 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
"""
Wrappers for the background task callable and the foreground future.
These are used by the TraitsExecutor machinery.
"""
import logging
from traits.api import Bool, HasStrictTraits, HasTraits, Instance, observe
from traits_futures.i_task_specification import IFuture
logger = logging.getLogger(__name__)
[docs]
class FutureWrapper(HasStrictTraits):
"""
Wrapper for the IFuture.
Passes on messages received for this future.
"""
#: The Traits Futures future being wrapped
future = Instance(IFuture)
#: Object that receives messages from the background task.
receiver = Instance(HasTraits)
#: Bool recording whether the future has completed or not. The
#: executor listens to this trait to decide when it can clean up
#: its own internal state.
done = Bool(False)
@observe("receiver:message")
def _dispatch_to_future(self, event):
"""
Pass on a message to the future.
"""
message = event.new
done = self.future.receive(message)
if done:
self.done = True
[docs]
def run_background_task(task, sender, cancelled):
"""
Wrapper for callables submitted to the underlying executor.
Parameters
----------
task
Callable representing the background task. This will be called
with arguments ``send`` and ``cancelled``.
sender : IMessageSender
Object used to send messages.
cancelled
Zero-argument callable returning bool. This can be called to check
whether cancellation has been requested.
"""
try:
with sender:
task(sender.send, cancelled)
except BaseException:
# We'll only ever get here in the case of a coding error. But in
# case that happens, it's useful to have the exception logged to
# help the developer.
logger.exception("Unexpected exception in background task.")
raise