Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
44ba683b
Commit
44ba683b
authored
Oct 02, 2015
by
Yury Selivanov
Browse files
Options
Browse Files
Download
Plain Diff
asyncio: Make ensure_future() accept all kinds of awaitables.
parents
9dd9661d
6492035b
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
41 additions
and
2 deletions
+41
-2
Doc/whatsnew/3.5.rst
Doc/whatsnew/3.5.rst
+7
-0
Lib/asyncio/tasks.py
Lib/asyncio/tasks.py
+14
-2
Lib/test/test_asyncio/test_tasks.py
Lib/test/test_asyncio/test_tasks.py
+18
-0
Misc/NEWS
Misc/NEWS
+2
-0
No files found.
Doc/whatsnew/3.5.rst
View file @
44ba683b
...
...
@@ -803,6 +803,13 @@ Notable changes in the :mod:`asyncio` module since Python 3.4.0:
:class:`asyncio.Queue` class.
(Contributed by Victor Stinner.)
Updates in 3.5.1:
* The :func:`~asyncio.ensure_future` function and all functions that
use it, such as :meth:`loop.run_until_complete() <asyncio.BaseEventLoop.run_until_complete>`,
now accept all kinds of :term:`awaitable objects <awaitable>`.
(Contributed by Yury Selivanov.)
bz2
---
...
...
Lib/asyncio/tasks.py
View file @
44ba683b
...
...
@@ -512,7 +512,7 @@ def async(coro_or_future, *, loop=None):
def
ensure_future
(
coro_or_future
,
*
,
loop
=
None
):
"""Wrap a coroutine in a future.
"""Wrap a coroutine
or an awaitable
in a future.
If the argument is a Future, it is returned directly.
"""
...
...
@@ -527,8 +527,20 @@ def ensure_future(coro_or_future, *, loop=None):
if
task
.
_source_traceback
:
del
task
.
_source_traceback
[
-
1
]
return
task
elif
compat
.
PY35
and
inspect
.
isawaitable
(
coro_or_future
):
return
ensure_future
(
_wrap_awaitable
(
coro_or_future
),
loop
=
loop
)
else
:
raise
TypeError
(
'A Future or coroutine is required'
)
raise
TypeError
(
'A Future, a coroutine or an awaitable is required'
)
@
coroutine
def
_wrap_awaitable
(
awaitable
):
"""Helper for asyncio.ensure_future().
Wraps awaitable (an object with __await__) into a coroutine
that will later be wrapped in a Task by ensure_future().
"""
return
(
yield
from
awaitable
.
__await__
())
class
_GatheringFuture
(
futures
.
Future
):
...
...
Lib/test/test_asyncio/test_tasks.py
View file @
44ba683b
...
...
@@ -153,6 +153,24 @@ class TaskTests(test_utils.TestCase):
t
=
asyncio
.
ensure_future
(
t_orig
,
loop
=
self
.
loop
)
self
.
assertIs
(
t
,
t_orig
)
@
unittest
.
skipUnless
(
PY35
,
'need python 3.5 or later'
)
def
test_ensure_future_awaitable
(
self
):
class
Aw
:
def
__init__
(
self
,
coro
):
self
.
coro
=
coro
def
__await__
(
self
):
return
(
yield
from
self
.
coro
)
@
asyncio
.
coroutine
def
coro
():
return
'ok'
loop
=
asyncio
.
new_event_loop
()
self
.
set_event_loop
(
loop
)
fut
=
asyncio
.
ensure_future
(
Aw
(
coro
()),
loop
=
loop
)
loop
.
run_until_complete
(
fut
)
assert
fut
.
result
()
==
'ok'
def
test_ensure_future_neither
(
self
):
with
self
.
assertRaises
(
TypeError
):
asyncio
.
ensure_future
(
'ok'
)
...
...
Misc/NEWS
View file @
44ba683b
...
...
@@ -152,6 +152,8 @@ Library
- Issue #23572: Fixed functools.singledispatch on classes with falsy
metaclasses. Patch by Ethan Furman.
- asyncio: ensure_future() now accepts awaitable objects.
IDLE
----
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment