У меня есть программа, которая работает на 2 темы.Основной поток для своей собственной работы, а другой поток продолжает вызывать recv()
на сокете UDP.
В основном, структура кода выглядит следующим образом:
done = False
def run_sock():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('localhost', 12345))
while not done: # receive data until work done
data = sock.recv(1500)
print(data)
sock.close()
thread = threading.Thread(target=run_sock, daemon=True)
thread.start()
# Main thread
while not done:
... # Do work here
if some_condition: # Stop running, thread should as well
done = True
thread.join()
Я хочу закрытьсокет, когда основной поток изменяется done
на True
, но когда это происходит, сокет все еще находится в своем текущем блокирующем вызове recv
, и он должен получить другое сообщение, прежде чем он окончательно остановится.
Есть ли способ изящно закрыть сокет (без необходимости обрабатывать ошибки)?Я пробовал sock.shutdown(socket.SHUT_RDWR)
, sock.setblocking(False)
, но все они вызывают ошибки.