Skip to content

Commit 6e385ac

Browse files
committed
Work on
1 parent b375604 commit 6e385ac

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

Lib/test/test_asyncio/test_tasks.py

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ class BaseTaskTests:
9595
Task = None
9696
Future = None
9797

98-
def new_task(self, loop, coro, name='TestTask'):
99-
return self.__class__.Task(coro, loop=loop, name=name)
98+
def new_task(self, loop, coro, name='TestTask', context=None):
99+
return self.__class__.Task(coro, loop=loop, name=name, context=context)
100100

101101
def new_future(self, loop):
102102
return self.__class__.Future(loop=loop)
@@ -2527,6 +2527,90 @@ async def main():
25272527

25282528
self.assertEqual(cvar.get(), -1)
25292529

2530+
def test_context_4(self):
2531+
cvar = contextvars.ContextVar('cvar')
2532+
2533+
async def coro(val):
2534+
await asyncio.sleep(0)
2535+
cvar.set(val)
2536+
2537+
async def main():
2538+
ret = []
2539+
ctx = contextvars.copy_context()
2540+
ret.append(ctx.get(cvar))
2541+
t1 = self.new_task(loop, coro(1), context=ctx)
2542+
await t1
2543+
ret.append(ctx.get(cvar))
2544+
t2 = self.new_task(loop, coro(2), context=ctx)
2545+
await t2
2546+
ret.append(ctx.get(cvar))
2547+
return ret
2548+
2549+
loop = asyncio.new_event_loop()
2550+
try:
2551+
task = self.new_task(loop, main())
2552+
ret = loop.run_until_complete(task)
2553+
finally:
2554+
loop.close()
2555+
2556+
self.assertEqual([None, 1, 2], ret)
2557+
2558+
def test_context_5(self):
2559+
cvar = contextvars.ContextVar('cvar')
2560+
2561+
async def coro(val):
2562+
await asyncio.sleep(0)
2563+
cvar.set(val)
2564+
2565+
async def main():
2566+
ret = []
2567+
ctx = contextvars.copy_context()
2568+
ret.append(ctx.get(cvar))
2569+
t1 = asyncio.create_task(coro(1), context=ctx)
2570+
await t1
2571+
ret.append(ctx.get(cvar))
2572+
t2 = asyncio.create_task(coro(2), context=ctx)
2573+
await t2
2574+
ret.append(ctx.get(cvar))
2575+
return ret
2576+
2577+
loop = asyncio.new_event_loop()
2578+
try:
2579+
task = self.new_task(loop, main())
2580+
ret = loop.run_until_complete(task)
2581+
finally:
2582+
loop.close()
2583+
2584+
self.assertEqual([None, 1, 2], ret)
2585+
2586+
def test_context_6(self):
2587+
cvar = contextvars.ContextVar('cvar')
2588+
2589+
async def coro(val):
2590+
await asyncio.sleep(0)
2591+
cvar.set(val)
2592+
2593+
async def main():
2594+
ret = []
2595+
ctx = contextvars.copy_context()
2596+
ret.append(ctx.get(cvar))
2597+
t1 = loop.create_task(coro(1), context=ctx)
2598+
await t1
2599+
ret.append(ctx.get(cvar))
2600+
t2 = loop.create_task(coro(2), context=ctx)
2601+
await t2
2602+
ret.append(ctx.get(cvar))
2603+
return ret
2604+
2605+
loop = asyncio.new_event_loop()
2606+
try:
2607+
task = loop.create_task(main())
2608+
ret = loop.run_until_complete(task)
2609+
finally:
2610+
loop.close()
2611+
2612+
self.assertEqual([None, 1, 2], ret)
2613+
25302614
def test_get_coro(self):
25312615
loop = asyncio.new_event_loop()
25322616
coro = coroutine_function()

Modules/_asynciomodule.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2030,13 +2030,13 @@ _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop,
20302030
return -1;
20312031
}
20322032

2033-
if (context != NULL) {
2034-
self->task_context = Py_NewRef(context);
2035-
} else {
2033+
if (context == NULL) {
20362034
Py_XSETREF(self->task_context, PyContext_CopyCurrent());
20372035
if (self->task_context == NULL) {
20382036
return -1;
20392037
}
2038+
} else {
2039+
self->task_context = Py_NewRef(context);
20402040
}
20412041

20422042
Py_CLEAR(self->task_fut_waiter);

0 commit comments

Comments
 (0)