Home > Enterprise >  Asyncio - create_task blocks thread
Asyncio - create_task blocks thread

Time:11-11

I'm trying to create a Python script that will receive messages from a websocket connection and every time it receives a new message, it needs to run an asyncio task in the background.

In order to "simulate" this process, i made a blocking functio that starts counting with a while True statement. The expected output is that every time a new message is received from the ws connection, a new count starts, but in my case, as soon as i run the script, the count function will block the whole code. How can i solve this?

Here is what i tried:

import asyncio
import websockets
import json
import time

#this is the blocking function..
def counter():
    count = 0
    while True:
        print(count)
        count  = 1
        time.sleep(0.5)
    
async def main():
    while True:
        try:
            async with websockets.connect('MY-URL') as websocket:

                while True:
                    msg = await asyncio.wait_for(websocket.recv(), 500)
                   
                    try:
                        data = json.loads(msg)
                        await loop.create_task(counter())

                    except Exception as e:
                        print(e)
        
        except Exception as e:
            print(e)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

CodePudding user response:

You have two major problems here. Your first problem is, that you create an infinite loop in counter and than call it, when you try to pass it to create_task. This way create_task is never even called. The second obvious problem is, that you try to pass a method to create_task while it expects a coroutine. Define your counter method again as coroutine using async def and replace time.sleep with asyncio.sleep and I think it might work.

As a general note: You cannot have blocking code in the same thread as your event loop. This means never ever use time.sleep in asynchronous code...

  • Related