17db96d56Sopenharmony_ci"""High-level support for working with threads in asyncio"""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport functools
47db96d56Sopenharmony_ciimport contextvars
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cifrom . import events
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci__all__ = "to_thread",
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciasync def to_thread(func, /, *args, **kwargs):
137db96d56Sopenharmony_ci    """Asynchronously run function *func* in a separate thread.
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci    Any *args and **kwargs supplied for this function are directly passed
167db96d56Sopenharmony_ci    to *func*. Also, the current :class:`contextvars.Context` is propagated,
177db96d56Sopenharmony_ci    allowing context variables from the main thread to be accessed in the
187db96d56Sopenharmony_ci    separate thread.
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    Return a coroutine that can be awaited to get the eventual result of *func*.
217db96d56Sopenharmony_ci    """
227db96d56Sopenharmony_ci    loop = events.get_running_loop()
237db96d56Sopenharmony_ci    ctx = contextvars.copy_context()
247db96d56Sopenharmony_ci    func_call = functools.partial(ctx.run, func, *args, **kwargs)
257db96d56Sopenharmony_ci    return await loop.run_in_executor(None, func_call)
26