2

I am trying to add web-socket functionality (to respond to some occasional inbound web-socket based requests) to an existing small python desktop app that is already doing other things. It already has a couple of threads running performing various tasks.

I have found and reviewed a few STACK articles that are similar to my issue here, and sadly, I'm pretty novice to async in python. I haven't been able to create a solution based on the other articles.

Here is one of those similar articles: Asyncio websocket in separate thread

I was unable to get such a solution to work for me.

Here is my simple code that fails:

# asamp.py
import time
import datetime
import asyncio
import websockets
import threading

def bgWorker_SK():
    # create handler for each connection
    async def handler(websocket, path):
        data = await websocket.recv()
        reply = f"Data recieved as:  {data}!"
        await websocket.send(reply)
        
    start_server = websockets.serve(handler, "localhost", 5564)
    asyncio.loop.run_until_complete(start_server)
    asyncio.loop.run_forever()

bgsk = threading.Thread(target=bgWorker_SK, daemon=True).start() 


if __name__ == '__main__':  
    
    # the main is off busy doing something other work...
    # trivial example here
    while True:        
        print (datetime.datetime.now())
        time.sleep(2)

The above, generates the error in Python 3.8.10:

builtins.RuntimeError: There is no current event loop in thread 'Thread-1'.

Please help :-{

1 Answer 1

2

Try:

# asamp.py
import time
import datetime
import asyncio
import websockets
import threading


def bgWorker_SK():
    # create handler for each connection
    async def handler(websocket, path):
        data = await websocket.recv()
        reply = f"Data recieved as:  {data}!"
        await websocket.send(reply)

    loop = asyncio.new_event_loop()   # <-- create new loop in this thread here
    asyncio.set_event_loop(loop)

    start_server = websockets.serve(handler, "localhost", 5564)
    loop.run_until_complete(start_server)
    loop.run_forever()


bgsk = threading.Thread(target=bgWorker_SK, daemon=True).start()


if __name__ == "__main__":
    # the main is off busy doing something other work...
    # trivial example here
    while True:
        print(datetime.datetime.now())
        time.sleep(2)

This opens new TCP port on localhost:5564 and starts listening on it.

Sign up to request clarification or add additional context in comments.

Comments

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.