137

When trying to run the asyncio hello world code example given in the docs:

import asyncio

async def hello_world():
    print("Hello World!")

loop = asyncio.get_event_loop()
# Blocking call which returns when the hello_world() coroutine is done
loop.run_until_complete(hello_world())
loop.close()

I get the error:

RuntimeError: Event loop is closed

I am using python 3.5.3.

1

3 Answers 3

204

On Windows seems to be a problem with EventLoopPolicy, use this snippet to work around it:

asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main())
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks, but how did you even find this out?
@Shryder Functional code started throwing this error after upgrading Python, I looked for what has changed between the python versions and saw the default EventLoopPolicy has been replaced (was mentioned somewhere in the docs).
If you use asyncio.run function, it will close the event loop
@j4hangir, sometimes you don't want to close the event loop and keep reusing it. I faced an error where I reuse the event loop and I had to revert to asyncio.get_event_loop()
Even using asyncio,run, I still had to set the loop policy to get it to work. Py3.10
|
120

You have already called loop.close() before you ran that sample piece of code, on the global event loop:

>>> import asyncio
>>> asyncio.get_event_loop().close()
>>> asyncio.get_event_loop().is_closed()
True
>>> asyncio.get_event_loop().run_until_complete(asyncio.sleep(1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../lib/python3.6/asyncio/base_events.py", line 443, in run_until_complete
    self._check_closed()
  File "/.../lib/python3.6/asyncio/base_events.py", line 357, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

You need to create a new loop:

loop = asyncio.new_event_loop()

You can set that as the new global loop with:

asyncio.set_event_loop(asyncio.new_event_loop())

and then just use asyncio.get_event_loop() again.

Alternatively, just restart your Python interpreter, the first time you try to get the global event loop you get a fresh new one, unclosed.

As of Python 3.7, the process of creating, managing, then closing the loop (as well as a few other resources) is handled for you when use asyncio.run(). It should be used instead of loop.run_until_complete(), and there is no need any more to first get or set the loop.

3 Comments

If you still get Event loop is closed your code might be using a handle to the old event loop.
Any idea why it's still not working from this output and code? pastecode.io/s/894dr1o4
@Lod it did work. The errors are exceptions in the event loop cleanup hooks. It does look messy and it’s caused by a known aiohttp bug interacting with the Windows asyncio loop implementation but your code worked. That’s why the output starts with 3 before the Exception ignored part.
41

...and just in case:

import platform
if platform.system()=='Windows':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

If you ever deploy your code in the cloud it might avoid painful debug.

1 Comment

windows event loop has very tight limitation on file descriptors number, stackoverflow.com/questions/47675410/…

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.