Message367988
Hi,
I'm running the following code in a Jupyter notebook (so there is already a running loop).
`run_coro` (non-async function) adds given coroutines to the loop with `loop.create_task`. I want to return the task objects created by `loop.create_task` to check for result later in the code.
Adding the task objects to a list and returning the list has the exception handler behave differently than expected.
```
async def test1():
''' Enumerate numbers from 1 to 9'''
n = 0
while (n := n + 1) < 10:
print(f'Test 1: {n}')
await asyncio.sleep(0.3)
return 'Test 1: DONE'
async def test2():
''' Enumerate numbers starting 1, raising exception at 5'''
n = 0
while (n := n + 1) < 10:
if n == 5:
raise ValueError('Test Exception')
print(f'Test 2: {n}')
await asyncio.sleep(0.2)
def handle_exception(loop, context):
if context['exception']:
print(f'Caught exception <{context["exception"]}> while executing {context["future"]}')
def run_coro(loop, coros):
loop.set_exception_handler(handle_exception)
tasks = deque()
for coro in coros:
task = loop.create_task(coro)
#tasks.append(task)
# ^--- if I uncomment, exc handler behaves strangely
return tasks
# ^-- BUT if I remove the "return" statement, it behaves correctly again
loop = asyncio.get_running_loop() # retrieves Jupyter's running loop
tasks = run_coro(loop, [test1(), test2()])
```
Normal (expected output):
```
Test 1: 1
Test 2: 1
Test 2: 2
Test 1: 2
Test 2: 3
Test 1: 3
Test 2: 4
Caught exception <Test Exception> while executing <Task finished name='Task-214' coro=<test2() done, defined at <ipython-input-225-b5df8e07130e>:10> exception=ValueError('Test Exception')>
Test 1: 4
Test 1: 5
Test 1: 6
Test 1: 7
Test 1: 8
Test 1: 9
```
If I uncomment `tasks.append(task)` and return the list of task objects, output is:
```
Test 1: 1
Test 2: 1
Test 2: 2
Test 1: 2
Test 2: 3
Test 1: 3
Test 2: 4
Test 1: 4
Test 1: 5
Test 1: 6
Test 1: 7
Test 1: 8
Test 1: 9
```
If I re-run the code (re-run the Jupyter cell) the exception message would appear at the beginning of the output (as if it had been waiting in a queue somewhere), so for some reason it seems to get eaten-up somewhere.
The code works normally again if I remove the return statement from the `run_coro` function.
Is this expected behaviour? Am I missing something? |
|
Date |
User |
Action |
Args |
2020-05-03 17:36:41 | jeanmonet | set | recipients:
+ jeanmonet, asvetlov, yselivanov |
2020-05-03 17:36:41 | jeanmonet | set | messageid: <1588527401.93.0.870743970124.issue40487@roundup.psfhosted.org> |
2020-05-03 17:36:41 | jeanmonet | link | issue40487 messages |
2020-05-03 17:36:41 | jeanmonet | create | |
|