Witam wszystkich - to mój pierwszy post tutaj a ponieważ jestem świeżakiem w pythonie to pewnie nie ostatni :-)
Otóż próbuję zrobić prosty interpreter poleceń na UDP, tak abym mógł "rozmawiać" z większym skryptem.
Chciałbym zawrzeć w głównym skrypcie odbieranie danych z socketa ale nie mogę sobie pozwolić na funkcje blokującą ponieważ główny skrypt również zajmuje się odbieraniem i przetwarzaniem danych (odbiera je z portu szeregowego co 1ms i po obróbce zapisuje do pliku). Poniższy kod działa (nie blokuje) ale zauważyłem duże zużycie procesora przez proces pythona z tym kodem.
Aby program działał, celowo nie obsługuję wyjątku, który funkcja serverSock.recvfrom(1024)
zgłasza za każdym obiegiem pętli gdy nie ma odebranych danych. Czy duże zużycie procesora może być związane właśnie z występowaniem tego wyjątku w każdym obiegu pętli? Może ktoś zna ciekawsze rozwiązanie na odbieranie danych bez blokowania np. na zasadzie cyklicznego wywoływania funkcji, która zwraca True
jak są dane i False
jak nie ma?
import socket
UDP_IP = "192.168.1.21"
UDP_PORT = 5050
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP, UDP_PORT))
serverSock.setblocking(False)
print('Nasłuchuję na: {}:{}'.format(UDP_IP, UDP_PORT))
while True:
try:
data, addr = serverSock.recvfrom(1024)
except:
pass
else:
sdata = data.decode()
print('Odebrano: ' + sdata)
print(addr)
if 'start' in sdata:
print('OK')
serverSock.sendto('OK - START\n'.encode(), addr)
if 'stop' in sdata:
print('OK')
serverSock.sendto('OK - STOP\n'.encode(), addr)
if 'exit' in sdata:
exit()