Mam problem podczas próby poznania gniazd dla komunikacji sieciowej. Zrobiłem prosty wątek, który nasłuchuje połączeń i tworzy procesy do łączenia klientów. Mój problem polega jednak na tym, że nie mogę uzyskać prawidłowego przyłączenia się wątku, ponieważ nie znalazłem sposobu na anulowanie połączenia socket.accept() - wywołanie kiedy chcę opuścić program.Gniazdo nasłuchiwania w wątku python
Mój kod wygląda następująco;
class ServerThread(threading.Thread):
def __init__(self, queue, host, port):
threading.Thread.__init__(self)
self.queue = queue
self.running = True
self.hostname = host
self.port = port
def run(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((self.hostname, self.port))
self.socket.listen(1)
while self.running:
try:
conn, address = self.socket.accept()
process = Process(target=server_slave, args=(conn, address, self.queue))
process.daemon = True
process.start()
except socket.timeout:
pass
def stop(self):
self.running = False
self.socket.close()
udało mi się dostać do zamknięcia programu przez ustawienie self.setDaemon(True)
i po prostu wyjście z programu głównego, podając wszystko do wielkiej śmieciarza - ale to wydaje się być złym rozwiązaniem. Próbowałem również ustawić limit czasu dla gniazda, ale to powoduje uzyskanie [Errno 35] Resource temporarily unavailable
(niezależnie od faktycznego limitu czasu, nawet gdy ustawiłem go na lata ...).
Co robię źle? Czy zaprojektowałem wątek głupio, czy też przeoczyłem coś o akceptowaniu połączeń?
'ale to wydaje się złym rozwiązaniem' - to działa? Jeśli nie lubisz, gdy system operacyjny zakończy wszystkie wątki, możesz spróbować zamknąć gniazdo nasłuchiwania z głównego lub innego wątku. Zwykle powoduje to, że accept() zwraca "wcześnie" z błędem. Działa na większości systemów operacyjnych/języków, ale nie jest wypróbowany w Pythonie, więc nie jest odpowiedzią. –
To działa - ale mam wrażenie, że nie bardzo dobrze traktuję potencjalnych klientów. Opublikowalem rozwiązanie, które wydaje się milsze, ponieważ pozwala na ukończenie kodu, ale wciąż wydaje się nieco dziwne, ponieważ kończy się tworzeniem nowego procesu, który będę musiał od razu dołączyć. – Norling