@@ -1208,3 +1208,72 @@ def test_function(**kwargs: Any) -> None:
12081208
12091209 # SyncToAsync.__call__.loop.run_in_executor has a param named `task_context`.
12101210 await test_function (task_context = 1 )
1211+
1212+
1213+ def test_nested_task () -> None :
1214+ async def inner () -> asyncio .Task [None ]:
1215+ return asyncio .create_task (sync_to_async (print )("inner" ))
1216+
1217+ async def main () -> None :
1218+ task = await sync_to_async (async_to_sync (inner ))()
1219+ await task
1220+
1221+ async_to_sync (main )()
1222+
1223+
1224+ def test_nested_task_later () -> None :
1225+ def later (fut : asyncio .Future [asyncio .Task [None ]]) -> None :
1226+ task = asyncio .create_task (sync_to_async (print )("later" ))
1227+ fut .set_result (task )
1228+
1229+ async def inner () -> asyncio .Future [asyncio .Task [None ]]:
1230+ loop = asyncio .get_running_loop ()
1231+ fut = loop .create_future ()
1232+ loop .call_later (0.1 , later , fut )
1233+ return fut
1234+
1235+ async def main () -> None :
1236+ fut = await sync_to_async (async_to_sync (inner ))()
1237+ task = await fut
1238+ await task
1239+
1240+ async_to_sync (main )()
1241+
1242+
1243+ def test_double_nested_task () -> None :
1244+ async def inner () -> asyncio .Task [None ]:
1245+ return asyncio .create_task (sync_to_async (print )("inner" ))
1246+
1247+ async def outer () -> asyncio .Task [asyncio .Task [None ]]:
1248+ return asyncio .create_task (sync_to_async (async_to_sync (inner ))())
1249+
1250+ async def main () -> None :
1251+ outer_task = await sync_to_async (async_to_sync (outer ))()
1252+ inner_task = await outer_task
1253+ await inner_task
1254+
1255+ async_to_sync (main )()
1256+
1257+
1258+ def test_two_nested_tasks_with_asyncio_run () -> None :
1259+ barrier = asyncio .Barrier (3 )
1260+ event = threading .Event ()
1261+
1262+ async def inner () -> None :
1263+ task = asyncio .create_task (sync_to_async (event .wait )())
1264+ await barrier .wait ()
1265+ await task
1266+
1267+ async def outer () -> tuple [asyncio .Task [None ], asyncio .Task [None ]]:
1268+ task0 = asyncio .create_task (inner ())
1269+ task1 = asyncio .create_task (inner ())
1270+ await barrier .wait ()
1271+ event .set ()
1272+ return task0 , task1
1273+
1274+ async def main () -> None :
1275+ task0 , task1 = await sync_to_async (async_to_sync (outer ))()
1276+ await task0
1277+ await task1
1278+
1279+ asyncio .run (main ())
0 commit comments