Task#
Superclasses: Object
Implemented Interfaces: AsyncResult
A GTask represents and manages a cancellable ‘task’.
Asynchronous operations#
The most common usage of GTask is as a AsyncResult, to
manage data during an asynchronous operation. You call
new in the ‘start’ method, followed by
set_task_data and the like if you need to keep some
additional data associated with the task, and then pass the
task object around through your asynchronous operation.
Eventually, you will call a method such as
return_pointer or return_error, which
will save the value you give it and then invoke the task’s callback
function in the thread-default main context (see
push_thread_default)
where it was created (waiting until the next iteration of the main
loop first, if necessary). The caller will pass the GTask back to
the operation’s finish function (as a AsyncResult), and you can
use propagate_pointer or the like to extract the
return value.
Using GTask requires the thread-default MainContext from when
the GTask was constructed to be running at least until the task has
completed and its data has been freed.
If a GTask has been constructed and its callback set, it is an error to
not call g_task_return_*() on it. GLib will warn at runtime if this happens
(since 2.76).
Here is an example for using GTask as a AsyncResult:
typedef struct {
CakeFrostingType frosting;
char *message;
} DecorationData;
static void
decoration_data_free (DecorationData *decoration)
{
g_free (decoration->message);
g_slice_free (DecorationData, decoration);
}
static void
baked_cb (Cake *cake,
gpointer user_data)
{
GTask *task = user_data;
DecorationData *decoration = g_task_get_task_data (task);
GError *error = NULL;
if (cake == NULL)
{
g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR,
"Go to the supermarket");
g_object_unref (task);
return;
}
if (!cake_decorate (cake, decoration->frosting, decoration->message, &error))
{
g_object_unref (cake);
// g_task_return_error() takes ownership of error
g_task_return_error (task, error);
g_object_unref (task);
return;
}
g_task_return_pointer (task, cake, g_object_unref);
g_object_unref (task);
}
void
baker_bake_cake_async (Baker *self,
guint radius,
CakeFlavor flavor,
CakeFrostingType frosting,
const char *message,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
DecorationData *decoration;
Cake *cake;
task = g_task_new (self, cancellable, callback, user_data);
if (radius < 3)
{
g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_TOO_SMALL,
"%ucm radius cakes are silly",
radius);
g_object_unref (task);
return;
}
cake = _baker_get_cached_cake (self, radius, flavor, frosting, message);
if (cake != NULL)
{
// _baker_get_cached_cake() returns a reffed cake
g_task_return_pointer (task, cake, g_object_unref);
g_object_unref (task);
return;
}
decoration = g_slice_new (DecorationData);
decoration->frosting = frosting;
decoration->message = g_strdup (message);
g_task_set_task_data (task, decoration, (GDestroyNotify) decoration_data_free);
_baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task);
}
Cake *
baker_bake_cake_finish (Baker *self,
GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (g_task_is_valid (result, self), NULL);
return g_task_propagate_pointer (G_TASK (result), error);
}
Chained asynchronous operations#
GTask also tries to simplify asynchronous operations that
internally chain together several smaller asynchronous
operations. get_cancellable, get_context,
and get_priority allow you to get back the task’s
Cancellable, MainContext, and
I/O priority
when starting a new subtask, so you don’t have to keep track
of them yourself. attach_source simplifies the case
of waiting for a source to fire (automatically using the correct
MainContext and priority).
Here is an example for chained asynchronous operations:
typedef struct {
Cake *cake;
CakeFrostingType frosting;
char *message;
} BakingData;
static void
decoration_data_free (BakingData *bd)
{
if (bd->cake)
g_object_unref (bd->cake);
g_free (bd->message);
g_slice_free (BakingData, bd);
}
static void
decorated_cb (Cake *cake,
GAsyncResult *result,
gpointer user_data)
{
GTask *task = user_data;
GError *error = NULL;
if (!cake_decorate_finish (cake, result, &error))
{
g_object_unref (cake);
g_task_return_error (task, error);
g_object_unref (task);
return;
}
// baking_data_free() will drop its ref on the cake, so we have to
// take another here to give to the caller.
g_task_return_pointer (task, g_object_ref (cake), g_object_unref);
g_object_unref (task);
}
static gboolean
decorator_ready (gpointer user_data)
{
GTask *task = user_data;
BakingData *bd = g_task_get_task_data (task);
cake_decorate_async (bd->cake, bd->frosting, bd->message,
g_task_get_cancellable (task),
decorated_cb, task);
return G_SOURCE_REMOVE;
}
static void
baked_cb (Cake *cake,
gpointer user_data)
{
GTask *task = user_data;
BakingData *bd = g_task_get_task_data (task);
GError *error = NULL;
if (cake == NULL)
{
g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR,
"Go to the supermarket");
g_object_unref (task);
return;
}
bd->cake = cake;
// Bail out now if the user has already cancelled
if (g_task_return_error_if_cancelled (task))
{
g_object_unref (task);
return;
}
if (cake_decorator_available (cake))
decorator_ready (task);
else
{
GSource *source;
source = cake_decorator_wait_source_new (cake);
// Attach @source to @task’s GMainContext and have it call
// decorator_ready() when it is ready.
g_task_attach_source (task, source, decorator_ready);
g_source_unref (source);
}
}
void
baker_bake_cake_async (Baker *self,
guint radius,
CakeFlavor flavor,
CakeFrostingType frosting,
const char *message,
gint priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
BakingData *bd;
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_priority (task, priority);
bd = g_slice_new0 (BakingData);
bd->frosting = frosting;
bd->message = g_strdup (message);
g_task_set_task_data (task, bd, (GDestroyNotify) baking_data_free);
_baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task);
}
Cake *
baker_bake_cake_finish (Baker *self,
GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (g_task_is_valid (result, self), NULL);
return g_task_propagate_pointer (G_TASK (result), error);
}
Asynchronous operations from synchronous ones#
You can use run_in_thread to turn a synchronous
operation into an asynchronous one, by running it in a thread.
When it completes, the result will be dispatched to the thread-default main
context (see push_thread_default) where the GTask
was created.
Running a task in a thread:
typedef struct {
guint radius;
CakeFlavor flavor;
CakeFrostingType frosting;
char *message;
} CakeData;
static void
cake_data_free (CakeData *cake_data)
{
g_free (cake_data->message);
g_slice_free (CakeData, cake_data);
}
static void
bake_cake_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
{
Baker *self = source_object;
CakeData *cake_data = task_data;
Cake *cake;
GError *error = NULL;
cake = bake_cake (baker, cake_data->radius, cake_data->flavor,
cake_data->frosting, cake_data->message,
cancellable, &error);
if (cake)
g_task_return_pointer (task, cake, g_object_unref);
else
g_task_return_error (task, error);
}
void
baker_bake_cake_async (Baker *self,
guint radius,
CakeFlavor flavor,
CakeFrostingType frosting,
const char *message,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
CakeData *cake_data;
GTask *task;
cake_data = g_slice_new (CakeData);
cake_data->radius = radius;
cake_data->flavor = flavor;
cake_data->frosting = frosting;
cake_data->message = g_strdup (message);
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free);
g_task_run_in_thread (task, bake_cake_thread);
g_object_unref (task);
}
Cake *
baker_bake_cake_finish (Baker *self,
GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (g_task_is_valid (result, self), NULL);
return g_task_propagate_pointer (G_TASK (result), error);
}
Adding cancellability to uncancellable tasks#
Finally, run_in_thread and
run_in_thread_sync can be used to turn an uncancellable
operation into a cancellable one. If you call
set_return_on_cancel, passing TRUE, then if the task’s
Cancellable is cancelled, it will return control back to the
caller immediately, while allowing the task thread to continue running in the
background (and simply discarding its result when it finally does finish).
Provided that the task thread is careful about how it uses
locks and other externally-visible resources, this allows you
to make ‘GLib-friendly’ asynchronous and cancellable
synchronous variants of blocking APIs.
Cancelling a task:
static void
bake_cake_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
{
Baker *self = source_object;
CakeData *cake_data = task_data;
Cake *cake;
GError *error = NULL;
cake = bake_cake (baker, cake_data->radius, cake_data->flavor,
cake_data->frosting, cake_data->message,
&error);
if (error)
{
g_task_return_error (task, error);
return;
}
// If the task has already been cancelled, then we don’t want to add
// the cake to the cake cache. Likewise, we don’t want to have the
// task get cancelled in the middle of updating the cache.
// g_task_set_return_on_cancel() will return %TRUE here if it managed
// to disable return-on-cancel, or %FALSE if the task was cancelled
// before it could.
if (g_task_set_return_on_cancel (task, FALSE))
{
// If the caller cancels at this point, their
// GAsyncReadyCallback won’t be invoked until we return,
// so we don’t have to worry that this code will run at
// the same time as that code does. But if there were
// other functions that might look at the cake cache,
// then we’d probably need a GMutex here as well.
baker_add_cake_to_cache (baker, cake);
g_task_return_pointer (task, cake, g_object_unref);
}
}
void
baker_bake_cake_async (Baker *self,
guint radius,
CakeFlavor flavor,
CakeFrostingType frosting,
const char *message,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
CakeData *cake_data;
GTask *task;
cake_data = g_slice_new (CakeData);
...
task = g_task_new (self, cancellable, callback, user_data);
g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free);
g_task_set_return_on_cancel (task, TRUE);
g_task_run_in_thread (task, bake_cake_thread);
}
Cake *
baker_bake_cake_sync (Baker *self,
guint radius,
CakeFlavor flavor,
CakeFrostingType frosting,
const char *message,
GCancellable *cancellable,
GError **error)
{
CakeData *cake_data;
GTask *task;
Cake *cake;
cake_data = g_slice_new (CakeData);
...
task = g_task_new (self, cancellable, NULL, NULL);
g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free);
g_task_set_return_on_cancel (task, TRUE);
g_task_run_in_thread_sync (task, bake_cake_thread);
cake = g_task_propagate_pointer (task, error);
g_object_unref (task);
return cake;
}
Porting from#
GTask’s API attempts to be simpler than SimpleAsyncResult’s
in several ways:
You can save task-specific data with
set_task_data, and retrieve it later withget_task_data. This replaces the abuse ofset_op_res_gpointerfor the same purpose withSimpleAsyncResult.In addition to the task data,
GTaskalso keeps track of the priority,Cancellable, andMainContextassociated with the task, so tasks that consist of a chain of simpler asynchronous operations will have easy access to those values when starting each sub-task.return_error_if_cancelledprovides simplified handling for cancellation. In addition, cancellation overrides any otherGTaskreturn value by default, likeSimpleAsyncResultdoes whenset_check_cancellableis called. (You can useset_check_cancellableto turn off that behavior.) On the other hand,run_in_threadguarantees that it will always run yourtask_func, even if the task’sCancellableis already cancelled before the task gets a chance to run; you can start yourtask_funcwith areturn_error_if_cancelledcheck if you need the old behavior.The ‘return’ methods (eg,
return_pointer) automatically cause the task to be ‘completed’ as well, and there is no need to worry about the ‘complete’ vs ‘complete in idle’ distinction. (GTaskautomatically figures out whether the task’s callback can be invoked directly, or if it needs to be sent to anotherMainContext, or delayed until the next iteration of the currentMainContext.)The ‘finish’ functions for
GTaskbased operations are generally much simpler thanSimpleAsyncResultones, normally consisting of only a single call topropagate_pointeror the like. Sincepropagate_pointer‘steals’ the return value from theGTask, it is not necessary to juggle pointers around to prevent it from being freed twice.With
SimpleAsyncResult, it was common to callpropagate_errorfrom the_finish()wrapper function, and have virtual method implementations only deal with successful returns. This behavior is deprecated, because it makes it difficult for a subclass to chain to a parent class’s async methods. Instead, the wrapper function should just be a simple wrapper, and the virtual method should call an appropriateg_task_propagate_function. Note that wrapper methods can now uselegacy_propagate_errorto do old-styleSimpleAsyncResulterror-returning behavior, andis_taggedto check if a result is tagged as having come from the_async()wrapper function (for ‘short-circuit’ results, such as when passing0toread_async).
Thread-safety considerations#
Due to some infelicities in the API design, there is a
thread-safety concern that users of GTask have to be aware of:
If the main thread drops its last reference to the source object
or the task data before the task is finalized, then the finalizers
of these objects may be called on the worker thread.
This is a problem if the finalizers use non-threadsafe API, and can lead to hard-to-debug crashes. Possible workarounds include:
Clear task data in a signal handler for
notify::completedKeep iterating a main context in the main thread and defer dropping the reference to the source object to that main context when the task is finalized
Constructors#
- class Task
- classmethod new(source_object: Object | None = None, cancellable: Cancellable | None = None, callback: Callable[[Object | None, AsyncResult, Any], None] | None = None, callback_data: Any = None) Task#
Creates a
Taskacting onsource_object, which will eventually be used to invokecallbackin the current [thread-default main context][g-main-context-push-thread-default].Call this in the “start” method of your asynchronous method, and pass the
Taskaround throughout the asynchronous operation. You can useset_task_data()to attach task-specific data to the object, which you can retrieve later viaget_task_data().By default, if
cancellableis cancelled, then the return value of the task will always beCANCELLED, even if the task had already completed before the cancellation. This allows for simplified handling in cases where cancellation may imply that other objects that the task depends on have been destroyed. If you do not want this behavior, you can useset_check_cancellable()to change it.Added in version 2.36.
- Parameters:
source_object – the
Objectthat owns this task, orNone.cancellable – optional
Cancellableobject,Noneto ignore.callback – a
AsyncReadyCallback.callback_data – user data passed to
callback.
Methods#
- class Task
- get_cancellable() Cancellable | None#
Gets
task'sCancellableAdded in version 2.36.
- get_check_cancellable() bool#
Gets
task's check-cancellable flag. Seeset_check_cancellable()for more details.Added in version 2.36.
- get_completed() bool#
Gets the value of
Task:completed. This changes fromFalsetoTrueafter the task’s callback is invoked, and will returnFalseif called from inside the callback.Added in version 2.44.
- get_context() MainContext#
Gets the
MainContextthattaskwill return its result in (that is, the context that was the [thread-default main context][g-main-context-push-thread-default] at the point whentaskwas created).This will always return a non-
Nonevalue, even if the task’s context is the defaultMainContext.Added in version 2.36.
- get_name() str | None#
Gets
task’s name. Seeset_name().Added in version 2.60.
- get_return_on_cancel() bool#
Gets
task's return-on-cancel flag. Seeset_return_on_cancel()for more details.Added in version 2.36.
- get_source_object() Object | None#
Gets the source object from
task. Likeget_source_object(), but does not ref the object.Added in version 2.36.
- get_source_tag() Any | None#
Gets
task's source tag. Seeset_source_tag().Added in version 2.36.
- classmethod is_valid(source_object: Object | None = None) bool#
Checks that
resultis aTask, and thatsource_objectis its source object (or thatsource_objectisNoneandresulthas no source object). This can be used inreturn_if_fail()checks.Added in version 2.36.
- Parameters:
source_object – the source object expected to be associated with the task
- propagate_boolean() bool#
Gets the result of
taskas agboolean.If the task resulted in an error, or was cancelled, then this will instead return
Falseand seterror.Since this method transfers ownership of the return value (or error) to the caller, you may only call it once.
Added in version 2.36.
- propagate_int() int#
Gets the result of
taskas an integer (gssize).If the task resulted in an error, or was cancelled, then this will instead return -1 and set
error.Since this method transfers ownership of the return value (or error) to the caller, you may only call it once.
Added in version 2.36.
- propagate_pointer() Any | None#
Gets the result of
taskas a pointer, and transfers ownership of that value to the caller.If the task resulted in an error, or was cancelled, then this will instead return
Noneand seterror.Since this method transfers ownership of the return value (or error) to the caller, you may only call it once.
Added in version 2.36.
- propagate_value() tuple[bool, Value]#
Gets the result of
taskas aValue, and transfers ownership of that value to the caller. As withreturn_value(), this is a generic low-level method;propagate_pointer()and the like will usually be more useful for C code.If the task resulted in an error, or was cancelled, then this will instead set
errorand returnFalse.Since this method transfers ownership of the return value (or error) to the caller, you may only call it once.
Added in version 2.64.
- classmethod report_error(callback: Callable[[Object | None, AsyncResult, Any], None] | None, callback_data: Any, source_tag: Any, error: GError) None#
Creates a
Taskand then immediately callsreturn_error()on it. Use this in the wrapper function of an asynchronous method when you want to avoid even calling the virtual method. You can then useis_tagged()in the finish method wrapper to check if the result there is tagged as having been created by the wrapper method, and deal with it appropriately if so.See also
report_new_error().Added in version 2.36.
- Parameters:
callback – a
AsyncReadyCallback.callback_data – user data passed to
callback.source_tag – an opaque pointer indicating the source of this task
error – error to report
- return_boolean(result: bool) None#
Sets
task's result toresultand completes the task (seereturn_pointer()for more discussion of exactly what this means).Added in version 2.36.
- Parameters:
result – the
gbooleanresult of a task function.
- return_error(error: GError) None#
Sets
task's result toerror(whichtaskassumes ownership of) and completes the task (seereturn_pointer()for more discussion of exactly what this means).Note that since the task takes ownership of
error, and since the task may be completed before returning fromreturn_error(), you cannot assume thaterroris still valid after calling this. Callcopy()on the error if you need to keep a local copy as well.See also
return_new_error,return_new_error_literal.Added in version 2.36.
- Parameters:
error – the
Errorresult of a task function.
- return_error_if_cancelled() bool#
Checks if
task'sCancellablehas been cancelled, and if so, setstask's error accordingly and completes the task (seereturn_pointer()for more discussion of exactly what this means).Added in version 2.36.
- return_int(result: int) None#
Sets
task's result toresultand completes the task (seereturn_pointer()for more discussion of exactly what this means).Added in version 2.36.
- Parameters:
result – the integer (
gssize) result of a task function.
- return_new_error_literal(domain: int, code: int, message: str) None#
Sets
task’s result to a newErrorcreated fromdomain,code,messageand completes the task.See
return_pointerfor more discussion of exactly what ‘completing the task’ means.See also
return_new_error.Added in version 2.80.
- Parameters:
domain – a
Quark.code – an error code.
message – an error message
- return_pointer(result: Any = None, result_destroy: Callable[[Any], None] | None = None) None#
Sets
task's result toresultand completes the task. Ifresultis notNone, thenresult_destroywill be used to freeresultif the caller does not take ownership of it withpropagate_pointer().“Completes the task” means that for an ordinary asynchronous task it will either invoke the task’s callback, or else queue that callback to be invoked in the proper
MainContext, or in the next iteration of the currentMainContext. For a task run viarun_in_thread()orrun_in_thread_sync(), calling this method will saveresultto be returned to the caller later, but the task will not actually be completed until theTaskThreadFuncexits.Note that since the task may be completed before returning from
return_pointer(), you cannot assume thatresultis still valid after calling this, unless you are still holding another reference on it.Added in version 2.36.
- Parameters:
result – the pointer result of a task function
result_destroy – a
DestroyNotifyfunction.
- return_value(result: Value | None = None) None#
Sets
task's result toresult(by copying it) and completes the task.If
resultisNonethen aValueof type %G_TYPE_POINTER with a value ofNonewill be used for the result.This is a very generic low-level method intended primarily for use by language bindings; for C code,
return_pointer()and the like will normally be much easier to use.Added in version 2.64.
- Parameters:
result – the
Valueresult of a task function
- run_in_thread(task_func: Callable[[Task, Object, Any, Cancellable | None], None]) None#
Runs
task_funcin another thread. Whentask_funcreturns,task'sAsyncReadyCallbackwill be invoked intask'sMainContext.This takes a ref on
taskuntil the task completes.See
TaskThreadFuncfor more details about howtask_funcis handled.Although GLib currently rate-limits the tasks queued via
run_in_thread(), you should not assume that it will always do this. If you have a very large number of tasks to run (several tens of tasks), but don’t want them to all run at once, you should only queue a limited number of them (around ten) at a time.Be aware that if your task depends on other tasks to complete, use of this function could lead to a livelock if the other tasks also use this function and enough of them (around 10) execute in a dependency chain, as that will exhaust the thread pool. If this situation is possible, consider using a separate worker thread or thread pool explicitly, rather than using
run_in_thread().Added in version 2.36.
- Parameters:
task_func – a
TaskThreadFunc
- run_in_thread_sync(task_func: Callable[[Task, Object, Any, Cancellable | None], None]) None#
Runs
task_funcin another thread, and waits for it to return or be cancelled. You can usepropagate_pointer(), etc, afterward to get the result oftask_func.See
TaskThreadFuncfor more details about howtask_funcis handled.Normally this is used with tasks created with a
Nonecallback, but note that even if the task does have a callback, it will not be invoked whentask_funcreturns.Task:completed will be set toTruejust before this function returns.Although GLib currently rate-limits the tasks queued via
run_in_thread_sync(), you should not assume that it will always do this. If you have a very large number of tasks to run, but don’t want them to all run at once, you should only queue a limited number of them at a time.Added in version 2.36.
- Parameters:
task_func – a
TaskThreadFunc
- set_check_cancellable(check_cancellable: bool) None#
Sets or clears
task's check-cancellable flag. If this isTrue(the default), thenpropagate_pointer(), etc, andhad_error()will check the task’sCancellablefirst, and if it has been cancelled, then they will consider the task to have returned an “Operation was cancelled” error (CANCELLED), regardless of any other error or return value the task may have had.If
check_cancellableisFalse, then theTaskwill not check the cancellable itself, and it is up totask's owner to do this (eg, viareturn_error_if_cancelled()).If you are using
set_return_on_cancel()as well, then you must leave check-cancellable setTrue.Added in version 2.36.
- Parameters:
check_cancellable – whether
Taskwill check the state of itsCancellablefor you.
- set_name(name: str | None = None) None#
Sets
task’s name, used in debugging and profiling. The name defaults toNone.The task name should describe in a human readable way what the task does. For example, ‘Open file’ or ‘Connect to network host’. It is used to set the name of the
Sourceused for idle completion of the task.This function may only be called before the
taskis first used in a thread other than the one it was constructed in. It is called automatically byset_source_tag()if not called already.Added in version 2.60.
- Parameters:
name – a human readable name for the task, or
Noneto unset it
- set_priority(priority: int) None#
Sets
task's priority. If you do not call this, it will default to %G_PRIORITY_DEFAULT.This will affect the priority of
Sourcecreated withattach_source()and the scheduling of tasks run in threads, and can also be explicitly retrieved later viaget_priority().Added in version 2.36.
- Parameters:
priority – the priority of the request
- set_return_on_cancel(return_on_cancel: bool) bool#
Sets or clears
task's return-on-cancel flag. This is only meaningful for tasks run viarun_in_thread()orrun_in_thread_sync().If
return_on_cancelisTrue, then cancellingtask'sCancellablewill immediately cause it to return, as though the task’sTaskThreadFunchad calledreturn_error_if_cancelled()and then returned.This allows you to create a cancellable wrapper around an uninterruptible function. The
TaskThreadFuncjust needs to be careful that it does not modify any externally-visible state after it has been cancelled. To do that, the thread should callset_return_on_cancel()again to (atomically) set return-on-cancelFalsebefore making externally-visible changes; if the task gets cancelled before the return-on-cancel flag could be changed,set_return_on_cancel()will indicate this by returningFalse.You can disable and re-enable this flag multiple times if you wish. If the task’s
Cancellableis cancelled while return-on-cancel isFalse, then callingset_return_on_cancel()to set itTrueagain will cause the task to be cancelled at that point.If the task’s
Cancellableis already cancelled before you callrun_in_thread()/run_in_thread_sync(), then theTaskThreadFuncwill still be run (for consistency), but the task will also be completed right away.Added in version 2.36.
- Parameters:
return_on_cancel – whether the task returns automatically when it is cancelled.
- set_source_tag(source_tag: Any = None) None#
Sets
task's source tag.You can use this to tag a task return value with a particular pointer (usually a pointer to the function doing the tagging) and then later check it using
get_source_tag()(oris_tagged()) in the task’s “finish” function, to figure out if the response came from a particular place.A macro wrapper around this function will automatically set the task’s name to the string form of
source_tagif it’s not already set, for convenience.Added in version 2.36.
- Parameters:
source_tag – an opaque pointer indicating the source of this task
- set_static_name(name: str | None = None) None#
Sets
task’s name, used in debugging and profiling.This is a variant of
set_name()that avoids copyingname.Added in version 2.76.
- Parameters:
name – a human readable name for the task. Must be a string literal