Source code for traits_futures.background_call

# (C) Copyright 2018-2020 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!

"""
Background task consisting of a simple callable.
"""
from traits.api import Callable, Dict, HasStrictTraits, Str, Tuple

from traits_futures.base_future import BaseFuture
from traits_futures.i_task_specification import ITaskSpecification


[docs]class CallBackgroundTask: """ Wrapper around the actual callable to be run. This wrapper provides the task that will be submitted to the concurrent.futures executor """ def __init__(self, callable, args, kwargs): self.callable = callable self.args = args self.kwargs = kwargs def __call__(self, send, cancelled): return self.callable(*self.args, **self.kwargs)
[docs]class CallFuture(BaseFuture): """ Object representing the front-end handle to a background call. """
[docs]@ITaskSpecification.register class BackgroundCall(HasStrictTraits): """ Object representing the background call to be executed. """ #: The callable to be executed. callable = Callable() #: Positional arguments to be passed to the callable. args = Tuple() #: Named arguments to be passed to the callable. kwargs = Dict(Str())
[docs] def future(self): """ Return a Future for the background task. Returns ------- future : CallFuture Future object that can be used to monitor the status of the background task. """ return CallFuture()
[docs] def background_task(self): """ Return a background callable for this task specification. Returns ------- collections.abc.Callable Callable accepting arguments ``send`` and ``cancelled``. The callable can use ``send`` to send messages and ``cancelled`` to check whether cancellation has been requested. """ return CallBackgroundTask( callable=self.callable, args=self.args, kwargs=self.kwargs.copy(), )
[docs]def submit_call(executor, callable, *args, **kwargs): """ Convenience function to submit a background call to an executor. Parameters ---------- executor : TraitsExecutor Executor to submit the task to. callable : collections.abc.Callable Callable to execute in the background. *args Positional arguments to pass to the callable. **kwargs Named arguments to pass to the callable. Returns ------- future : CallFuture Object representing the state of the background call. """ task = BackgroundCall(callable=callable, args=args, kwargs=kwargs) return executor.submit(task)