aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_asyncio/test_tasks.py
diff options
context:
space:
mode:
authorKumar Aditya <kumaraditya@python.org>2024-06-22 23:28:35 +0530
committerGitHub <noreply@github.com>2024-06-22 10:58:35 -0700
commit4717aaa1a72d1964f1531a7c613f37ce3d9056d9 (patch)
tree725e3b743d4ef707e89f5abe7804fce58fbd5036 /Lib/test/test_asyncio/test_tasks.py
parente21347549535b16f51a39986b78a2c2cd4ed09f4 (diff)
downloadcpython-4717aaa1a72d1964f1531a7c613f37ce3d9056d9.tar.gz
cpython-4717aaa1a72d1964f1531a7c613f37ce3d9056d9.zip
GH-107803: double linked list implementation for asyncio tasks (GH-107804)
* linked list * add tail optmiization to linked list * wip * wip * wip * more fixes * finally it works * add tests * remove weakreflist * add some comments * reduce code duplication in _asynciomodule.c * address some review comments * add invariants about the state of the linked list * add better explanation * clinic regen * reorder branches for better branch prediction * Update Modules/_asynciomodule.c * Apply suggestions from code review Co-authored-by: Itamar Oren <itamarost@gmail.com> * fix capturing of eager tasks * add comment to task finalization * fix tests and couple c implmentation to c task improved linked-list logic and more comments * fix test --------- Co-authored-by: Itamar Oren <itamarost@gmail.com>
Diffstat (limited to 'Lib/test/test_asyncio/test_tasks.py')
-rw-r--r--Lib/test/test_asyncio/test_tasks.py34
1 files changed, 23 insertions, 11 deletions
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index cc0d7f52a1b..9b22fb942c6 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -86,6 +86,7 @@ class BaseTaskTests:
Task = None
Future = None
+ all_tasks = None
def new_task(self, loop, coro, name='TestTask', context=None):
return self.__class__.Task(coro, loop=loop, name=name, context=context)
@@ -2267,7 +2268,7 @@ class BaseTaskTests:
coro = kill_me(self.loop)
task = asyncio.ensure_future(coro, loop=self.loop)
- self.assertEqual(asyncio.all_tasks(loop=self.loop), {task})
+ self.assertEqual(self.all_tasks(loop=self.loop), {task})
asyncio.set_event_loop(None)
@@ -2282,7 +2283,7 @@ class BaseTaskTests:
# no more reference to kill_me() task: the task is destroyed by the GC
support.gc_collect()
- self.assertEqual(asyncio.all_tasks(loop=self.loop), set())
+ self.assertEqual(self.all_tasks(loop=self.loop), set())
mock_handler.assert_called_with(self.loop, {
'message': 'Task was destroyed but it is pending!',
@@ -2431,7 +2432,7 @@ class BaseTaskTests:
message = m_log.error.call_args[0][0]
self.assertIn('Task was destroyed but it is pending', message)
- self.assertEqual(asyncio.all_tasks(self.loop), set())
+ self.assertEqual(self.all_tasks(self.loop), set())
def test_create_task_with_noncoroutine(self):
with self.assertRaisesRegex(TypeError,
@@ -2731,6 +2732,7 @@ def add_subclass_tests(cls):
# Add patched Task & Future back to the test case
cls.Task = Task
cls.Future = Future
+ cls.all_tasks = tasks.all_tasks
# Add an extra unit-test
cls.test_subclasses_ctask_cfuture = test_subclasses_ctask_cfuture
@@ -2804,6 +2806,7 @@ class CTask_CFuture_Tests(BaseTaskTests, SetMethodsTest,
Task = getattr(tasks, '_CTask', None)
Future = getattr(futures, '_CFuture', None)
+ all_tasks = getattr(tasks, '_c_all_tasks', None)
@support.refcount_test
def test_refleaks_in_task___init__(self):
@@ -2835,6 +2838,7 @@ class CTask_CFuture_SubclassTests(BaseTaskTests, test_utils.TestCase):
Task = getattr(tasks, '_CTask', None)
Future = getattr(futures, '_CFuture', None)
+ all_tasks = getattr(tasks, '_c_all_tasks', None)
@unittest.skipUnless(hasattr(tasks, '_CTask'),
@@ -2844,6 +2848,7 @@ class CTaskSubclass_PyFuture_Tests(BaseTaskTests, test_utils.TestCase):
Task = getattr(tasks, '_CTask', None)
Future = futures._PyFuture
+ all_tasks = getattr(tasks, '_c_all_tasks', None)
@unittest.skipUnless(hasattr(futures, '_CFuture'),
@@ -2853,6 +2858,7 @@ class PyTask_CFutureSubclass_Tests(BaseTaskTests, test_utils.TestCase):
Future = getattr(futures, '_CFuture', None)
Task = tasks._PyTask
+ all_tasks = tasks._py_all_tasks
@unittest.skipUnless(hasattr(tasks, '_CTask'),
@@ -2861,6 +2867,7 @@ class CTask_PyFuture_Tests(BaseTaskTests, test_utils.TestCase):
Task = getattr(tasks, '_CTask', None)
Future = futures._PyFuture
+ all_tasks = getattr(tasks, '_c_all_tasks', None)
@unittest.skipUnless(hasattr(futures, '_CFuture'),
@@ -2869,6 +2876,7 @@ class PyTask_CFuture_Tests(BaseTaskTests, test_utils.TestCase):
Task = tasks._PyTask
Future = getattr(futures, '_CFuture', None)
+ all_tasks = staticmethod(tasks._py_all_tasks)
class PyTask_PyFuture_Tests(BaseTaskTests, SetMethodsTest,
@@ -2876,6 +2884,7 @@ class PyTask_PyFuture_Tests(BaseTaskTests, SetMethodsTest,
Task = tasks._PyTask
Future = futures._PyFuture
+ all_tasks = staticmethod(tasks._py_all_tasks)
@add_subclass_tests
@@ -2915,6 +2924,7 @@ class BaseTaskIntrospectionTests:
_unregister_task = None
_enter_task = None
_leave_task = None
+ all_tasks = None
def test__register_task_1(self):
class TaskLike:
@@ -2928,9 +2938,9 @@ class BaseTaskIntrospectionTests:
task = TaskLike()
loop = mock.Mock()
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
self._register_task(task)
- self.assertEqual(asyncio.all_tasks(loop), {task})
+ self.assertEqual(self.all_tasks(loop), {task})
self._unregister_task(task)
def test__register_task_2(self):
@@ -2944,9 +2954,9 @@ class BaseTaskIntrospectionTests:
task = TaskLike()
loop = mock.Mock()
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
self._register_task(task)
- self.assertEqual(asyncio.all_tasks(loop), {task})
+ self.assertEqual(self.all_tasks(loop), {task})
self._unregister_task(task)
def test__register_task_3(self):
@@ -2960,9 +2970,9 @@ class BaseTaskIntrospectionTests:
task = TaskLike()
loop = mock.Mock()
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
self._register_task(task)
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
self._unregister_task(task)
def test__enter_task(self):
@@ -3013,13 +3023,13 @@ class BaseTaskIntrospectionTests:
task.get_loop = lambda: loop
self._register_task(task)
self._unregister_task(task)
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
def test__unregister_task_not_registered(self):
task = mock.Mock()
loop = mock.Mock()
self._unregister_task(task)
- self.assertEqual(asyncio.all_tasks(loop), set())
+ self.assertEqual(self.all_tasks(loop), set())
class PyIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests):
@@ -3027,6 +3037,7 @@ class PyIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests):
_unregister_task = staticmethod(tasks._py_unregister_task)
_enter_task = staticmethod(tasks._py_enter_task)
_leave_task = staticmethod(tasks._py_leave_task)
+ all_tasks = staticmethod(tasks._py_all_tasks)
@unittest.skipUnless(hasattr(tasks, '_c_register_task'),
@@ -3037,6 +3048,7 @@ class CIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests):
_unregister_task = staticmethod(tasks._c_unregister_task)
_enter_task = staticmethod(tasks._c_enter_task)
_leave_task = staticmethod(tasks._c_leave_task)
+ all_tasks = staticmethod(tasks._c_all_tasks)
else:
_register_task = _unregister_task = _enter_task = _leave_task = None