![]() |
Taskflow
3.2.0-Master-Branch
|
class to create an executor for running a taskflow graph More...
#include <executor.hpp>
Public Member Functions | |
Executor (size_t N=std::thread::hardware_concurrency()) | |
constructs the executor with N worker threads | |
~Executor () | |
destructs the executor | |
tf::Future< void > | run (Taskflow &taskflow) |
runs a taskflow once | |
tf::Future< void > | run (Taskflow &&taskflow) |
runs a moved taskflow once | |
template<typename C > | |
tf::Future< void > | run (Taskflow &taskflow, C &&callable) |
runs a taskflow once and invoke a callback upon completion | |
template<typename C > | |
tf::Future< void > | run (Taskflow &&taskflow, C &&callable) |
runs a moved taskflow once and invoke a callback upon completion | |
tf::Future< void > | run_n (Taskflow &taskflow, size_t N) |
runs a taskflow for N times | |
tf::Future< void > | run_n (Taskflow &&taskflow, size_t N) |
runs a moved taskflow for N times | |
template<typename C > | |
tf::Future< void > | run_n (Taskflow &taskflow, size_t N, C &&callable) |
runs a taskflow for N times and then invokes a callback | |
template<typename C > | |
tf::Future< void > | run_n (Taskflow &&taskflow, size_t N, C &&callable) |
runs a moved taskflow for N times and then invokes a callback | |
template<typename P > | |
tf::Future< void > | run_until (Taskflow &taskflow, P &&pred) |
runs a taskflow multiple times until the predicate becomes true | |
template<typename P > | |
tf::Future< void > | run_until (Taskflow &&taskflow, P &&pred) |
runs a moved taskflow and keeps running it until the predicate becomes true | |
template<typename P , typename C > | |
tf::Future< void > | run_until (Taskflow &taskflow, P &&pred, C &&callable) |
runs a taskflow multiple times until the predicate becomes true and then invokes the callback | |
template<typename P , typename C > | |
tf::Future< void > | run_until (Taskflow &&taskflow, P &&pred, C &&callable) |
runs a moved taskflow and keeps running it until the predicate becomes true and then invokes the callback | |
void | wait_for_all () |
wait for all tasks to complete | |
size_t | num_workers () const noexcept |
queries the number of worker threads | |
size_t | num_topologies () const |
queries the number of running topologies at the time of this call | |
size_t | num_taskflows () const |
queries the number of running taskflows with moved ownership | |
int | this_worker_id () const |
queries the id of the caller thread in this executor | |
template<typename F , typename... ArgsT> | |
auto | async (F &&f, ArgsT &&... args) |
runs a given function asynchronously | |
template<typename F , typename... ArgsT> | |
auto | named_async (const std::string &name, F &&f, ArgsT &&... args) |
runs a given function asynchronously and gives a name to this task | |
template<typename F , typename... ArgsT> | |
void | silent_async (F &&f, ArgsT &&... args) |
similar to tf::Executor::async but does not return a future object | |
template<typename F , typename... ArgsT> | |
void | named_silent_async (const std::string &name, F &&f, ArgsT &&... args) |
similar to tf::Executor::named_async but does not return a future object | |
template<typename Observer , typename... ArgsT> | |
std::shared_ptr< Observer > | make_observer (ArgsT &&... args) |
constructs an observer to inspect the activities of worker threads | |
template<typename Observer > | |
void | remove_observer (std::shared_ptr< Observer > observer) |
removes an observer from the executor | |
size_t | num_observers () const noexcept |
queries the number of observers | |
Friends | |
class | FlowBuilder |
class | Subflow |
class | Runtime |
class to create an executor for running a taskflow graph
An executor manages a set of worker threads to run one or multiple taskflows using an efficient work-stealing scheduling algorithm.
All the run
methods are thread-safe. You can submit multiple taskflows at the same time to an executor from different threads.
|
inlineexplicit |
constructs the executor with N
worker threads
The constructor spawns N
worker threads to run tasks in a work-stealing loop. The number of workers must be greater than zero or an exception will be thrown. By default, the number of worker threads is equal to the maximum hardware concurrency returned by std::thread::hardware_concurrency.
|
inline |
destructs the executor
The destructor calls Executor::wait_for_all to wait for all submitted taskflows to complete and then notifies all worker threads to stop and join these threads.
auto tf::Executor::async | ( | F && | f, |
ArgsT &&... | args | ||
) |
runs a given function asynchronously
F | callable type |
ArgsT | parameter types |
f | callable object to call |
args | parameters to pass to the callable |
The method creates an asynchronous task to launch the given function on the given arguments. Unlike std::async, the return here is a tf::Future that holds an optional object to the result. If the asynchronous task is cancelled before it runs, the return is a std::nullopt
, or the value returned by the callable.
This member function is thread-safe.
std::shared_ptr< Observer > tf::Executor::make_observer | ( | ArgsT &&... | args | ) |
constructs an observer to inspect the activities of worker threads
Observer | observer type derived from tf::ObserverInterface |
ArgsT | argument parameter pack |
args | arguments to forward to the constructor of the observer |
Each executor manages a list of observers with shared ownership with callers. For each of these observers, the two member functions, tf::ObserverInterface::on_entry and tf::ObserverInterface::on_exit will be called before and after the execution of a task.
This member function is not thread-safe.
auto tf::Executor::named_async | ( | const std::string & | name, |
F && | f, | ||
ArgsT &&... | args | ||
) |
runs a given function asynchronously and gives a name to this task
F | callable type |
ArgsT | parameter types |
name | name of the asynchronous task |
f | callable object to call |
args | parameters to pass to the callable |
The method creates a named asynchronous task to launch the given function on the given arguments. Naming an asynchronous task is primarily used for profiling and visualizing the task execution timeline. Unlike std::async, the return here is a tf::Future that holds an optional object to the result. If the asynchronous task is cancelled before it runs, the return is a std::nullopt
, or the value returned by the callable.
This member function is thread-safe.
void tf::Executor::named_silent_async | ( | const std::string & | name, |
F && | f, | ||
ArgsT &&... | args | ||
) |
similar to tf::Executor::named_async but does not return a future object
This member function is more efficient than tf::Executor::named_async and is encouraged to use when there is no data returned.
This member function is thread-safe.
|
inline |
|
inline |
queries the number of running topologies at the time of this call
When a taskflow is submitted to an executor, a topology is created to store runtime metadata of the running taskflow. When the execution of the submitted taskflow finishes, its corresponding topology will be removed from the executor.
|
inlinenoexcept |
queries the number of worker threads
Each worker represents one unique thread spawned by an executor upon its construction time.
void tf::Executor::remove_observer | ( | std::shared_ptr< Observer > | observer | ) |
removes an observer from the executor
This member function is not thread-safe.
|
inline |
runs a moved taskflow once
taskflow | a moved tf::Taskflow object |
This member function executes a moved taskflow once and returns a tf::Future object that eventually holds the result of the execution. The executor will take care of the lifetime of the moved taskflow.
This member function is thread-safe.
tf::Future< void > tf::Executor::run | ( | Taskflow && | taskflow, |
C && | callable | ||
) |
runs a moved taskflow once and invoke a callback upon completion
taskflow | a moved tf::Taskflow object |
callable | a callable object to be invoked after this run |
This member function executes a moved taskflow once and invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution. The executor will take care of the lifetime of the moved taskflow.
This member function is thread-safe.
|
inline |
runs a taskflow once
taskflow | a tf::Taskflow object |
This member function executes the given taskflow once and returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
tf::Future< void > tf::Executor::run | ( | Taskflow & | taskflow, |
C && | callable | ||
) |
runs a taskflow once and invoke a callback upon completion
taskflow | a tf::Taskflow object |
callable | a callable object to be invoked after this run |
This member function executes the given taskflow once and invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
|
inline |
runs a moved taskflow for N
times
taskflow | a moved tf::Taskflow object |
N | number of runs |
This member function executes a moved taskflow N
times and returns a tf::Future object that eventually holds the result of the execution. The executor will take care of the lifetime of the moved taskflow.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_n | ( | Taskflow && | taskflow, |
size_t | N, | ||
C && | callable | ||
) |
runs a moved taskflow for N
times and then invokes a callback
taskflow | a moved tf::Taskflow |
N | number of runs |
callable | a callable object to be invoked after this run |
This member function executes a moved taskflow N
times and invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
|
inline |
runs a taskflow for N
times
taskflow | a tf::Taskflow object |
N | number of runs |
This member function executes the given taskflow N
times and returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_n | ( | Taskflow & | taskflow, |
size_t | N, | ||
C && | callable | ||
) |
runs a taskflow for N
times and then invokes a callback
taskflow | a tf::Taskflow |
N | number of runs |
callable | a callable object to be invoked after this run |
This member function executes the given taskflow N
times and invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_until | ( | Taskflow && | taskflow, |
P && | pred | ||
) |
runs a moved taskflow and keeps running it until the predicate becomes true
taskflow | a moved tf::Taskflow object |
pred | a boolean predicate to return true for stop |
This member function executes a moved taskflow multiple times until the predicate returns true
. This member function returns a tf::Future object that eventually holds the result of the execution. The executor will take care of the lifetime of the moved taskflow.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_until | ( | Taskflow && | taskflow, |
P && | pred, | ||
C && | callable | ||
) |
runs a moved taskflow and keeps running it until the predicate becomes true and then invokes the callback
taskflow | a moved tf::Taskflow |
pred | a boolean predicate to return true for stop |
callable | a callable object to be invoked after this run completes |
This member function executes a moved taskflow multiple times until the predicate returns true
and then invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution. The executor will take care of the lifetime of the moved taskflow.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_until | ( | Taskflow & | taskflow, |
P && | pred | ||
) |
runs a taskflow multiple times until the predicate becomes true
taskflow | a tf::Taskflow |
pred | a boolean predicate to return true for stop |
This member function executes the given taskflow multiple times until the predicate returns true
. This member function returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
tf::Future< void > tf::Executor::run_until | ( | Taskflow & | taskflow, |
P && | pred, | ||
C && | callable | ||
) |
runs a taskflow multiple times until the predicate becomes true and then invokes the callback
taskflow | a tf::Taskflow |
pred | a boolean predicate to return true for stop |
callable | a callable object to be invoked after this run completes |
This member function executes the given taskflow multiple times until the predicate returns true
and then invokes the given callable when the execution completes. This member function returns a tf::Future object that eventually holds the result of the execution.
This member function is thread-safe.
void tf::Executor::silent_async | ( | F && | f, |
ArgsT &&... | args | ||
) |
similar to tf::Executor::async but does not return a future object
This member function is more efficient than tf::Executor::async and is encouraged to use when there is no data returned.
This member function is thread-safe.
|
inline |
queries the id of the caller thread in this executor
Each worker has an unique id in the range of 0
to N-1
associated with its parent executor. If the caller thread does not belong to the executor, -1
is returned.
|
inline |
wait for all tasks to complete
This member function waits until all submitted tasks (e.g., taskflows, asynchronous tasks) to finish.