python check socket receive within other loop — non-blocking?

Question:

I know the code to wait for socket in a loop like this.

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
data, addr = s.recvfrom(1024)
data = data.decode('utf-8')
print("Message from: " + str(addr))
print("From connected user: " + data)
com = data
data = data.upper()
data = "Message Received: " + data

however, I want to use this function in another main loop that refreshes every second. When this get called it freezes until meeting any msg.

Is there any way that I can "check msg" on off, and integrate this in the main loop refreshes every second?

Many thanks.

Asked By: fishjoe

||

Answers:

You can use select.select to poll for readiness to receive a message:

import socket
import select

s = socket.socket(type=socket.SOCK_DGRAM)
s.bind(('', 5000))
while True:
    r, _, _ = select.select([s], [], [], 1.0)
    if r:  # r will contain s if a message is ready
        data, addr = s.recvfrom(1024)
        data = data.decode('utf-8')
        print(f'n{addr}: {data}')
    else:
        print('.', end='', flush=True) # show activity
Answered By: Mark Tolonen
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.