3

I have taken the below code snippet from a book by author caleb hattingh. I tried running the code snippet and faced this error.(Practicing)

How do I resolve this?

import asyncio

async def f(delay):
    await asyncio.sleep(1 / delay)
    return delay

loop = asyncio.get_event_loop()
for i in range(10):
    loop.create_task(f(i))

print(loop)
pending = asyncio.all_tasks()
group = asyncio.gather(*pending, return_exceptions=True)
results = loop.run_until_complete(group)
print(f'Results: {results}')
loop.close()
1

2 Answers 2

6

You have to pass the loop as argument to the .all_tasks() function:

pending = asyncio.all_tasks(loop)

Output:

<_UnixSelectorEventLoop running=False closed=False debug=False>
<_GatheringFuture pending>
Results: [8, 5, 2, 9, 6, 3, ZeroDivisionError('division by zero'), 7, 4, 1]

So for a full correction of your script:

import asyncio

async def f(delay):
    if delay:
        await asyncio.sleep(1 / delay)
    return delay

loop = asyncio.get_event_loop()
for i in range(10):
    loop.create_task(f(i))

print(loop)
pending = asyncio.all_tasks(loop)
group = asyncio.gather(*pending, return_exceptions=True)
results = loop.run_until_complete(group)
print(f'Results: {results}')
loop.close()
Sign up to request clarification or add additional context in comments.

Comments

1

Using python3.7 and later versions you can omit the explicit creation and management of the event loop and tasks. The asyncio API has changed a few times and you will find tutorials covering outdated syntax. The following implementation corresponds to your solution.

import asyncio

async def f(delay):
    await asyncio.sleep(1 / delay)
    return delay

async def main():
    return await asyncio.gather(*[f(i) for i in range(10)], return_exceptions=True)

print(asyncio.run(main()))

Output

[ZeroDivisionError('division by zero'), 1, 2, 3, 4, 5, 6, 7, 8, 9]

1 Comment

HI, very usable solution. BTW, if we want to manually craete task using asyncio.create_task(), this error still apears, is there any workaround for this?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.