diff options
author | Kyle Stanley <aeros167@gmail.com> | 2020-05-19 03:03:28 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-19 03:03:28 (GMT) |
commit | cc2bbc2227c3f5ed9d8f6b3bd052e6f9e68279d2 (patch) | |
tree | 84839ab8dd6cc9969c3bb7516e20715a8273fb33 /Lib/asyncio | |
parent | d4fe098d1ee4f4056ac65cae55f5ffdd439dede0 (diff) | |
download | cpython-cc2bbc2227c3f5ed9d8f6b3bd052e6f9e68279d2.zip cpython-cc2bbc2227c3f5ed9d8f6b3bd052e6f9e68279d2.tar.gz cpython-cc2bbc2227c3f5ed9d8f6b3bd052e6f9e68279d2.tar.bz2 |
bpo-32309: Implement asyncio.to_thread() (GH-20143)
Implements `asyncio.to_thread`, a coroutine for asynchronously running IO-bound functions in a separate thread without blocking the event loop. See the discussion starting from [here](https://github.com/python/cpython/pull/18410#issuecomment-628930973) in GH-18410 for context.
Automerge-Triggered-By: @aeros
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/__init__.py | 2 | ||||
-rw-r--r-- | Lib/asyncio/threads.py | 21 |
2 files changed, 23 insertions, 0 deletions
diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index 28c2e2c..eb84bfb 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -17,6 +17,7 @@ from .queues import * from .streams import * from .subprocess import * from .tasks import * +from .threads import * from .transports import * # Exposed for _asynciomodule.c to implement now deprecated @@ -35,6 +36,7 @@ __all__ = (base_events.__all__ + streams.__all__ + subprocess.__all__ + tasks.__all__ + + threads.__all__ + transports.__all__) if sys.platform == 'win32': # pragma: no cover diff --git a/Lib/asyncio/threads.py b/Lib/asyncio/threads.py new file mode 100644 index 0000000..2f40467 --- /dev/null +++ b/Lib/asyncio/threads.py @@ -0,0 +1,21 @@ +"""High-level support for working with threads in asyncio""" + +import functools + +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*. + + Return an asyncio.Future which represents the eventual result of *func*. + """ + loop = events.get_running_loop() + func_call = functools.partial(func, *args, **kwargs) + return await loop.run_in_executor(None, func_call) |