Ho riscontrato un problema nel tentativo di apprendere i socket per le comunicazioni di rete. Ho creato un thread semplice che ascolta le connessioni e crea processi per connettere i client, ma il mio problema è che non riesco a far entrare correttamente il thread poiché non ho trovato un modo per cancellare il socket.accept() - call quando voglio lasciare il programma.Chiudi socket di ascolto in thread python
Il mio codice è simile a questo;
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()
Sono riuscito a ottenere il programma di chiudere impostando self.setDaemon(True)
e basta uscire dal programma principale, consegnando tutto al grande garbage collector - ma che sembra una cattiva soluzione. Ho anche provato a impostare un timeout per il socket ma questo si traduce nell'ottenere [Errno 35] Resource temporarily unavailable
(indipendentemente dal timeout effettivo, anche quando l'ho impostato su anni ...).
Cosa sto sbagliando? Ho progettato il thread in modo stupido o mi sono perso qualcosa nell'accettare le connessioni?
'ma che sembra una cattiva soluzione' - funziona? Se non ti piace che il sistema operativo termini tutti i tuoi thread, puoi provare a chiudere il socket di ascolto dal thread principale o altro. Questo di solito fa sì che accept() restituisca "early" con un errore. Funziona sulla maggior parte dei sistemi operativi/lingue, ma non è stato provato con Python, quindi non è una risposta. –
Funziona, ma ho la sensazione che potrei non trattare i potenziali clienti molto bene nel farlo. Ho pubblicato una soluzione che sembra più carina in quanto consente il completamento del codice, ma sembra ancora un po 'strano dal momento che termina con la creazione di un nuovo processo che dovrò unire subito. – Norling