Skip to content

Commit d51ce36

Browse files
committed
Add name keyword argument to loop.create_task()
* Fixes #309. * Refs bpo-34270.
1 parent d99d7dc commit d51ce36

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

tests/test_base.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,46 @@ async def coro():
541541
self.assertFalse(isinstance(task, MyTask))
542542
self.loop.run_until_complete(task)
543543

544+
def test_set_task_name(self):
545+
if self.implementation == 'asyncio' and sys.version_info < (3, 8, 0):
546+
raise unittest.SkipTest('unsupported task name')
547+
548+
self.loop._process_events = mock.Mock()
549+
550+
result = None
551+
552+
class MyTask(asyncio.Task):
553+
def set_name(self, name):
554+
nonlocal result
555+
result = name + "!"
556+
557+
def get_name(self):
558+
return result
559+
560+
async def coro():
561+
pass
562+
563+
factory = lambda loop, coro: MyTask(coro, loop=loop)
564+
565+
self.assertIsNone(self.loop.get_task_factory())
566+
task = self.loop.create_task(coro(), name="mytask")
567+
self.assertFalse(isinstance(task, MyTask))
568+
if sys.version_info >= (3, 8, 0):
569+
self.assertEqual(task.get_name(), "mytask")
570+
self.loop.run_until_complete(task)
571+
572+
self.loop.set_task_factory(factory)
573+
self.assertIs(self.loop.get_task_factory(), factory)
574+
575+
task = self.loop.create_task(coro(), name="mytask")
576+
self.assertTrue(isinstance(task, MyTask))
577+
self.assertEqual(result, "mytask!")
578+
self.assertEqual(task.get_name(), "mytask!")
579+
self.loop.run_until_complete(task)
580+
581+
self.loop.set_task_factory(None)
582+
self.assertIsNone(self.loop.get_task_factory())
583+
544584
def _compile_agen(self, src):
545585
try:
546586
g = {}

uvloop/loop.pyx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1386,16 +1386,29 @@ cdef class Loop:
13861386
"""Create a Future object attached to the loop."""
13871387
return self._new_future()
13881388

1389-
def create_task(self, coro):
1389+
def create_task(self, coro, *, name=None):
13901390
"""Schedule a coroutine object.
13911391
13921392
Return a task object.
1393+
1394+
If name is not None, task.set_name(name) will be called if the task
1395+
object has the set_name attribute, true for default Task in Python 3.8.
13931396
"""
13941397
self._check_closed()
13951398
if self._task_factory is None:
13961399
task = aio_Task(coro, loop=self)
13971400
else:
13981401
task = self._task_factory(self, coro)
1402+
1403+
# copied from asyncio.tasks._set_task_name (bpo-34270)
1404+
if name is not None:
1405+
try:
1406+
set_name = task.set_name
1407+
except AttributeError:
1408+
pass
1409+
else:
1410+
set_name(name)
1411+
13991412
return task
14001413

14011414
def set_task_factory(self, factory):

0 commit comments

Comments
 (0)