prefect.utilities.asyncutils
Utilities for interoperability with async functions and workers from various contexts.
Functions
get_thread_limiter
is_async_fn
True
if a function returns a coroutine.
See https://github.com/microsoft/pyright/issues/2142 for an example use
is_async_gen_fn
True
if a function is an async generator.
create_task
run_coro_as_sync
coroutine
: The coroutine to be run as a synchronous function.force_new_thread
: If True, the coroutine will always be run in a new thread. Defaults to False.wait_for_result
: If True, the function will wait for the coroutine to complete and return the result. If False, the function will submit the coroutine to the “run sync” event loop and return immediately, where it will eventually be run. Defaults to True.
- The result of the coroutine if wait_for_result is True, otherwise None.
run_sync_in_worker_thread
call_with_mark
run_async_from_worker_thread
run_async_in_new_loop
mark_as_worker_thread
in_async_worker_thread
in_async_main_thread
sync_compatible
- If in a thread with a running event loop, we will return the coroutine for the caller to await. This is normal async behavior.
- If in a blocking worker thread with access to an event loop in another thread, we will submit the async method to the event loop.
- If we cannot find an event loop, we will create a new one and run the async method then tear down the loop.
@sync_compatible
are synchronous. If
you want to use the decorated function in an async context, you will need to ignore the types
and “cast” the return type to a coroutine. For example:
asyncnullcontext
sync
add_event_loop_shutdown_callback
asyncio.run()
which waits for async generator shutdown by
default or explicit call of asyncio.shutdown_asyncgens()
. If the application
is entered with asyncio.run_until_complete()
and the user calls
asyncio.close()
without the generator shutdown call, this will not trigger
callbacks.
asyncio does not provided any other way to clean up a resource when the event
loop is about to close.
create_gather_task_group
gather
asyncio.gather
this expects to receive callables not coroutines.
This matches anyio
semantics.
Classes
GatherIncomplete
Used to indicate retrieving gather results before completion
GatherTaskGroup
A task group that gathers results.
AnyIO does not include gather
support. This class extends the TaskGroup
interface to allow simple gathering.
See https://github.com/agronholm/anyio/issues/100
This class should be instantiated with create_gather_task_group
.
Methods:
get_result
start
start
returns the result of task_status.started()
but here we must
return the key instead, we just won’t support this method for now.