summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-07-02 04:06:51 (GMT)
committerGitHub <noreply@github.com>2020-07-02 04:06:51 (GMT)
commitdf59293bf0d815fe37743025d639a63a78e0c771 (patch)
treec5620f0b8d6d04860852303d822dfb6551733651
parentfe0175f5b50967aae90cb759a0d2d016fb745584 (diff)
downloadcpython-df59293bf0d815fe37743025d639a63a78e0c771.zip
cpython-df59293bf0d815fe37743025d639a63a78e0c771.tar.gz
cpython-df59293bf0d815fe37743025d639a63a78e0c771.tar.bz2
bpo-40967: Remove deprecated asyncio.Task.current_task() and asyncio.Task.all_tasks() (GH-20874)
(cherry picked from commit 004e64e8059fe68a72890314673282f2e60d5ce1) Co-authored-by: Rémi Lapeyre <remi.lapeyre@lenstra.fr>
-rw-r--r--Doc/library/asyncio-task.rst25
-rw-r--r--Doc/whatsnew/3.9.rst5
-rw-r--r--Lib/asyncio/tasks.py28
-rw-r--r--Lib/test/test_asyncio/test_tasks.py48
-rw-r--r--Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst2
-rw-r--r--Modules/_asynciomodule.c89
-rw-r--r--Modules/clinic/_asynciomodule.c.h82
7 files changed, 9 insertions, 270 deletions
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index 21824ca..bac99b7 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -962,31 +962,6 @@ Task Object
.. versionadded:: 3.8
- .. classmethod:: all_tasks(loop=None)
-
- Return a set of all tasks for an event loop.
-
- By default all tasks for the current event loop are returned.
- If *loop* is ``None``, the :func:`get_event_loop` function
- is used to get the current loop.
-
- .. deprecated-removed:: 3.7 3.9
-
- Do not call this as a task method. Use the :func:`asyncio.all_tasks`
- function instead.
-
- .. classmethod:: current_task(loop=None)
-
- Return the currently running task or ``None``.
-
- If *loop* is ``None``, the :func:`get_event_loop` function
- is used to get the current loop.
-
- .. deprecated-removed:: 3.7 3.9
-
- Do not call this as a task method. Use the
- :func:`asyncio.current_task` function instead.
-
.. _asyncio_generator_based_coro:
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index d18eca8..689be1d 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -883,6 +883,11 @@ Removed
deprecated since 2006, and only returning ``False`` when it's called.
(Contributed by Batuhan Taskaya in :issue:`40208`)
+* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` have
+ have been removed. They were deprecated since Python 3.7 and you can use
+ :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead.
+ (Contributed by Rémi Lapeyre in :issue:`40967`)
+
Porting to Python 3.9
=====================
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 21b98b6..5e0692e 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -113,34 +113,6 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
# status is still pending
_log_destroy_pending = True
- @classmethod
- def current_task(cls, loop=None):
- """Return the currently running task in an event loop or None.
-
- By default the current task for the current event loop is returned.
-
- None is returned when called not in the context of a Task.
- """
- warnings.warn("Task.current_task() is deprecated since Python 3.7, "
- "use asyncio.current_task() instead",
- DeprecationWarning,
- stacklevel=2)
- if loop is None:
- loop = events.get_event_loop()
- return current_task(loop)
-
- @classmethod
- def all_tasks(cls, loop=None):
- """Return a set of all tasks for an event loop.
-
- By default all tasks for the current event loop are returned.
- """
- warnings.warn("Task.all_tasks() is deprecated since Python 3.7, "
- "use asyncio.all_tasks() instead",
- DeprecationWarning,
- stacklevel=2)
- return _all_tasks_compat(loop)
-
def __init__(self, coro, *, loop=None, name=None):
super().__init__(loop=loop)
if self._source_traceback:
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 3734013..f9db066 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1943,32 +1943,6 @@ class BaseTaskTests:
self.assertEqual(res, 'test')
self.assertIsNone(t2.result())
-
- def test_current_task_deprecated(self):
- Task = self.__class__.Task
-
- with self.assertWarns(DeprecationWarning):
- self.assertIsNone(Task.current_task(loop=self.loop))
-
- async def coro(loop):
- with self.assertWarns(DeprecationWarning):
- self.assertIs(Task.current_task(loop=loop), task)
-
- # See http://bugs.python.org/issue29271 for details:
- asyncio.set_event_loop(loop)
- try:
- with self.assertWarns(DeprecationWarning):
- self.assertIs(Task.current_task(None), task)
- with self.assertWarns(DeprecationWarning):
- self.assertIs(Task.current_task(), task)
- finally:
- asyncio.set_event_loop(None)
-
- task = self.new_task(self.loop, coro(self.loop))
- self.loop.run_until_complete(task)
- with self.assertWarns(DeprecationWarning):
- self.assertIsNone(Task.current_task(loop=self.loop))
-
def test_current_task(self):
self.assertIsNone(asyncio.current_task(loop=self.loop))
@@ -2305,16 +2279,6 @@ class BaseTaskTests:
self.assertIsInstance(exception, Exception)
self.assertEqual(exception.args, ("foo", ))
- def test_all_tasks_deprecated(self):
- Task = self.__class__.Task
-
- async def coro():
- with self.assertWarns(DeprecationWarning):
- assert Task.all_tasks(self.loop) == {t}
-
- t = self.new_task(self.loop, coro())
- self.loop.run_until_complete(t)
-
def test_log_destroyed_pending_task(self):
Task = self.__class__.Task
@@ -2337,15 +2301,7 @@ class BaseTaskTests:
self.assertEqual(asyncio.all_tasks(loop=self.loop), {task})
- # See http://bugs.python.org/issue29271 for details:
- asyncio.set_event_loop(self.loop)
- try:
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(Task.all_tasks(), {task})
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(Task.all_tasks(None), {task})
- finally:
- asyncio.set_event_loop(None)
+ asyncio.set_event_loop(None)
# execute the task so it waits for future
self.loop._run_once()
@@ -3043,8 +2999,6 @@ class BaseTaskIntrospectionTests:
self.assertEqual(asyncio.all_tasks(loop), set())
self._register_task(task)
self.assertEqual(asyncio.all_tasks(loop), set())
- with self.assertWarns(DeprecationWarning):
- self.assertEqual(asyncio.Task.all_tasks(loop), {task})
self._unregister_task(task)
def test__enter_task(self):
diff --git a/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst b/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst
new file mode 100644
index 0000000..4694d99
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst
@@ -0,0 +1,2 @@
+Removed :meth:`asyncio.Task.current_task` and
+:meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 0608c40..22eea3b 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -13,10 +13,8 @@ module _asyncio
_Py_IDENTIFIER(__asyncio_running_event_loop__);
_Py_IDENTIFIER(_asyncio_future_blocking);
_Py_IDENTIFIER(add_done_callback);
-_Py_IDENTIFIER(_all_tasks_compat);
_Py_IDENTIFIER(call_soon);
_Py_IDENTIFIER(cancel);
-_Py_IDENTIFIER(current_task);
_Py_IDENTIFIER(get_event_loop);
_Py_IDENTIFIER(send);
_Py_IDENTIFIER(throw);
@@ -2182,91 +2180,6 @@ TaskObj_get_fut_waiter(TaskObj *task, void *Py_UNUSED(ignored))
}
/*[clinic input]
-@classmethod
-_asyncio.Task.current_task
-
- loop: object = None
-
-Return the currently running task in an event loop or None.
-
-By default the current task for the current event loop is returned.
-
-None is returned when called not in the context of a Task.
-[clinic start generated code]*/
-
-static PyObject *
-_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=99fbe7332c516e03 input=cd14770c5b79c7eb]*/
-{
- PyObject *ret;
- PyObject *current_task_func;
-
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Task.current_task() is deprecated, " \
- "use asyncio.current_task() instead",
- 1) < 0) {
- return NULL;
- }
-
- current_task_func = _PyObject_GetAttrId(asyncio_mod, &PyId_current_task);
- if (current_task_func == NULL) {
- return NULL;
- }
-
- if (loop == Py_None) {
- loop = get_event_loop();
- if (loop == NULL) {
- Py_DECREF(current_task_func);
- return NULL;
- }
- ret = PyObject_CallOneArg(current_task_func, loop);
- Py_DECREF(current_task_func);
- Py_DECREF(loop);
- return ret;
- }
- else {
- ret = PyObject_CallOneArg(current_task_func, loop);
- Py_DECREF(current_task_func);
- return ret;
- }
-}
-
-/*[clinic input]
-@classmethod
-_asyncio.Task.all_tasks
-
- loop: object = None
-
-Return a set of all tasks for an event loop.
-
-By default all tasks for the current event loop are returned.
-[clinic start generated code]*/
-
-static PyObject *
-_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=11f9b20749ccca5d input=497f80bc9ce726b5]*/
-{
- PyObject *res;
- PyObject *all_tasks_func;
-
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "Task.all_tasks() is deprecated, " \
- "use asyncio.all_tasks() instead",
- 1) < 0) {
- return NULL;
- }
-
- all_tasks_func = _PyObject_GetAttrId(asyncio_mod, &PyId__all_tasks_compat);
- if (all_tasks_func == NULL) {
- return NULL;
- }
-
- res = PyObject_CallOneArg(all_tasks_func, loop);
- Py_DECREF(all_tasks_func);
- return res;
-}
-
-/*[clinic input]
_asyncio.Task._make_cancelled_error
Create the CancelledError to raise if the Task is cancelled.
@@ -2586,8 +2499,6 @@ static PyMethodDef TaskType_methods[] = {
_ASYNCIO_FUTURE_DONE_METHODDEF
_ASYNCIO_TASK_SET_RESULT_METHODDEF
_ASYNCIO_TASK_SET_EXCEPTION_METHODDEF
- _ASYNCIO_TASK_CURRENT_TASK_METHODDEF
- _ASYNCIO_TASK_ALL_TASKS_METHODDEF
_ASYNCIO_TASK_CANCEL_METHODDEF
_ASYNCIO_TASK_GET_STACK_METHODDEF
_ASYNCIO_TASK_PRINT_STACK_METHODDEF
diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h
index d3e59a4..a071efc 100644
--- a/Modules/clinic/_asynciomodule.c.h
+++ b/Modules/clinic/_asynciomodule.c.h
@@ -355,86 +355,6 @@ exit:
return return_value;
}
-PyDoc_STRVAR(_asyncio_Task_current_task__doc__,
-"current_task($type, /, loop=None)\n"
-"--\n"
-"\n"
-"Return the currently running task in an event loop or None.\n"
-"\n"
-"By default the current task for the current event loop is returned.\n"
-"\n"
-"None is returned when called not in the context of a Task.");
-
-#define _ASYNCIO_TASK_CURRENT_TASK_METHODDEF \
- {"current_task", (PyCFunction)(void(*)(void))_asyncio_Task_current_task, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_current_task__doc__},
-
-static PyObject *
-_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop);
-
-static PyObject *
-_asyncio_Task_current_task(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- static const char * const _keywords[] = {"loop", NULL};
- static _PyArg_Parser _parser = {NULL, _keywords, "current_task", 0};
- PyObject *argsbuf[1];
- Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
- PyObject *loop = Py_None;
-
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- if (!noptargs) {
- goto skip_optional_pos;
- }
- loop = args[0];
-skip_optional_pos:
- return_value = _asyncio_Task_current_task_impl(type, loop);
-
-exit:
- return return_value;
-}
-
-PyDoc_STRVAR(_asyncio_Task_all_tasks__doc__,
-"all_tasks($type, /, loop=None)\n"
-"--\n"
-"\n"
-"Return a set of all tasks for an event loop.\n"
-"\n"
-"By default all tasks for the current event loop are returned.");
-
-#define _ASYNCIO_TASK_ALL_TASKS_METHODDEF \
- {"all_tasks", (PyCFunction)(void(*)(void))_asyncio_Task_all_tasks, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_all_tasks__doc__},
-
-static PyObject *
-_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop);
-
-static PyObject *
-_asyncio_Task_all_tasks(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
- PyObject *return_value = NULL;
- static const char * const _keywords[] = {"loop", NULL};
- static _PyArg_Parser _parser = {NULL, _keywords, "all_tasks", 0};
- PyObject *argsbuf[1];
- Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
- PyObject *loop = Py_None;
-
- args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
- if (!args) {
- goto exit;
- }
- if (!noptargs) {
- goto skip_optional_pos;
- }
- loop = args[0];
-skip_optional_pos:
- return_value = _asyncio_Task_all_tasks_impl(type, loop);
-
-exit:
- return return_value;
-}
-
PyDoc_STRVAR(_asyncio_Task__make_cancelled_error__doc__,
"_make_cancelled_error($self, /)\n"
"--\n"
@@ -912,4 +832,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
exit:
return return_value;
}
-/*[clinic end generated code: output=0e5c1eb8b692977b input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d0fc522bcbff9d61 input=a9049054013a1b77]*/