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