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