Skip to content Skip to sidebar Skip to footer

Asyncio In Corroutine Runtimeerror: No Running Event Loop

I'm writing multi-process code, which runs perfectly in Python 3.7. Yet I want one of the parallel process to execute an IO process take stakes for ever using AsyncIO i order to g

Solution 1:

As it seems from the Traceback log it is look like you are trying to add tasks to not running event loop.

/.pyenv/versions/3.7.4/lib/python3.7/multiprocessing/process.py:313: RuntimeWarning: coroutine '._get_filter_collateral..read_task' was never awaited

The loop was just created and it's not running yet, therefor the asyncio unable to attach tasks to it.

The following example will reproduce the same results, adding tasks and then trying to await for all of them to finish:

import asyncio
async def func(num):
    print('My name is func {0}...'.format(num))

loop = asyncio.get_event_loop()
tasks = list()
for i in range(5):
    tasks.append(asyncio.create_task(func(i)))
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

Results with:

Traceback (most recent call last):
  File "C:/tmp/stack_overflow.py", line 42, in <module>
    tasks.append(asyncio.create_task(func(i)))
  File "C:\Users\Amiram\AppData\Local\Programs\Python\Python37-32\lib\asyncio\tasks.py", line 324, in create_task
    loop = events.get_running_loop()
RuntimeError: no running eventloopsys:1: RuntimeWarning: coroutine 'func' was never awaited

Nonetheless the solution is pretty simple, you just need to add the tasks to the created loop - instead of asking the asyncio to go it. The only change is needed in the following line:

tasks.append(asyncio.create_task(func(i)))

Change the creation of the task from the asyncio to the newly created loop, you are able to do it because this is your loop unlike the asynio which is searching for a running one.

So the new line should look like this:

tasks.append(loop.create_task(func(i)))

Another solution could be running an async function and create the tasks there for example (Because that loop is already running now the asyncio enable to attach tasks to it):

import asyncio
async def func(num):
    print('Starting func {0}...'.format(num))
    await asyncio.sleep(0.1)
    print('Ending func {0}...'.format(num))

loop = asyncio.get_event_loop()
async def create_tasks_func():
    tasks = list()
    for i in range(5):
        tasks.append(asyncio.create_task(func(i)))
    await asyncio.wait(tasks)
loop.run_until_complete(create_tasks_func())
loop.close()

This simple change will results with:

Starting func 0...
Starting func 1...
Starting func 2...
Starting func 3...
Starting func 4...
Ending func 0...
Ending func 2...
Ending func 4...
Ending func 1...
Ending func 3...

Post a Comment for "Asyncio In Corroutine Runtimeerror: No Running Event Loop"