V
V
Vsevolod Debianov2021-07-27 17:48:31
Python
Vsevolod Debianov, 2021-07-27 17:48:31

How to properly close an asyncio loop?

Hello!

import asyncio
import aiohttp
aut_token = ("token")
tasks = []
iter_flag = True
interval = 0
seq = 0
class WAPI:

    async def receiver(WAPI_S):
        async for msg in WAPI_S:
            global interval
            global seq
            data = msg.json()
            seq = data.get("s")
            if data.get("op") == 10:
                interval = data.get("d").get("heartbeat_interval") / 1000 
            if data.get("op") == 11:
                pass
            raise aiohttp.ClientError

    async def heartbeating(WAPI_S):
        while iter_flag:
            await WAPI_S.send_json({
                            "op": 1,
                            "d": seq
                        })
            
            await asyncio.sleep(interval)

    async def event_manager():
        loop = asyncio.get_running_loop()
        try:
            async with aiohttp.ClientSession() as session:
                async with session.ws_connect("url") as WAPI_S: 
                    task_receive = loop.create_task(WAPI.receiver(WAPI_S)); task_heartbeating = loop.create_task(WAPI.heartbeating(WAPI_S))
                    tasks.append(task_receive); tasks.append(task_heartbeating)
                    await asyncio.gather(*tasks)
        except aiohttp.ClientError:
            global iter_flag
            iter_flag = False
            await asyncio.sleep(interval)
            for task in tasks:
                task.cancel()
            try:
                loop.close()
            except:
                loop.stop()
                
asyncio.run(WAPI.event_manager())


I'm trying to implement the interception of ClientError with the closing of the loop, but it doesn't even work. Throws a RuntimeError with "Event loop stopped before Future completed."

What is the right way to implement something like this?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question