mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	When I wrote the documentation for `asyncio.to_thread()`, I mistakenly assumed that `return await loop.run_in_executor(...)` within an async def function would return a Future. In reality, it returns a coroutine. This likely won't affect typical usage of `asyncio.to_thread()`, but it's important for the documentation to be correct here. In general, we also tend to avoid returning futures from high-level APIs in asyncio.
		
			
				
	
	
		
			25 lines
		
	
	
	
		
			790 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			25 lines
		
	
	
	
		
			790 B
		
	
	
	
		
			Python
		
	
	
	
	
	
"""High-level support for working with threads in asyncio"""
 | 
						|
 | 
						|
import functools
 | 
						|
import contextvars
 | 
						|
 | 
						|
from . import events
 | 
						|
 | 
						|
 | 
						|
__all__ = "to_thread",
 | 
						|
 | 
						|
 | 
						|
async def to_thread(func, /, *args, **kwargs):
 | 
						|
    """Asynchronously run function *func* in a separate thread.
 | 
						|
 | 
						|
    Any *args and **kwargs supplied for this function are directly passed
 | 
						|
    to *func*. Also, the current :class:`contextvars.Context` is propogated,
 | 
						|
    allowing context variables from the main thread to be accessed in the
 | 
						|
    separate thread.
 | 
						|
 | 
						|
    Return a coroutine that can be awaited to get the eventual result of *func*.
 | 
						|
    """
 | 
						|
    loop = events.get_running_loop()
 | 
						|
    ctx = contextvars.copy_context()
 | 
						|
    func_call = functools.partial(ctx.run, func, *args, **kwargs)
 | 
						|
    return await loop.run_in_executor(None, func_call)
 |