xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/asyncio/threads.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker"""High-level support for working with threads in asyncio"""
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Workerimport functools
4*cda5da8dSAndroid Build Coastguard Workerimport contextvars
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Workerfrom . import events
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker
9*cda5da8dSAndroid Build Coastguard Worker__all__ = "to_thread",
10*cda5da8dSAndroid Build Coastguard Worker
11*cda5da8dSAndroid Build Coastguard Worker
12*cda5da8dSAndroid Build Coastguard Workerasync def to_thread(func, /, *args, **kwargs):
13*cda5da8dSAndroid Build Coastguard Worker    """Asynchronously run function *func* in a separate thread.
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Worker    Any *args and **kwargs supplied for this function are directly passed
16*cda5da8dSAndroid Build Coastguard Worker    to *func*. Also, the current :class:`contextvars.Context` is propagated,
17*cda5da8dSAndroid Build Coastguard Worker    allowing context variables from the main thread to be accessed in the
18*cda5da8dSAndroid Build Coastguard Worker    separate thread.
19*cda5da8dSAndroid Build Coastguard Worker
20*cda5da8dSAndroid Build Coastguard Worker    Return a coroutine that can be awaited to get the eventual result of *func*.
21*cda5da8dSAndroid Build Coastguard Worker    """
22*cda5da8dSAndroid Build Coastguard Worker    loop = events.get_running_loop()
23*cda5da8dSAndroid Build Coastguard Worker    ctx = contextvars.copy_context()
24*cda5da8dSAndroid Build Coastguard Worker    func_call = functools.partial(ctx.run, func, *args, **kwargs)
25*cda5da8dSAndroid Build Coastguard Worker    return await loop.run_in_executor(None, func_call)
26