Ağ iletişimi için yuvalar hakkında bilgi edinmek için bir sorunum var. Bağlantıları dinleyen ve istemcileri bağlamaya yönelik süreçler oluşturan basit bir iş parçacığı yaptım, sorunum olsa da, socket.accept() - çağrıyı iptal etmenin bir yolunu bulamadığım için iş parçacığının düzgün bir şekilde katılmasını sağlayamam. programdan çıkmak istediğimde.Dinleme soketini python iş parçacığındaki kapatın
Kodum şunun gibi görünüyor;
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()
Ben self.setDaemon(True)
ayarlama ve sadece büyük çöpçüyle şeyi teslim, ana programdan çıkmadan kapatmak için programı almak başarmış - ama bu kötü bir çözüm gibi görünüyor. Ayrıca soket için bir zaman aşımı ayarlamayı denedim, ancak bu, [Errno 35] Resource temporarily unavailable
almamın sonucudur (gerçek zaman aşımından bağımsız olarak, yıllara ayarladığım zaman bile ...).
Neyi yanlış yapıyorum? İpliği aptalca tasarlamış mıyım yoksa bağlantıları kabul etmekle ilgili bir şey özledim mi?
sonra sağ
conn.settimeout(None)
koyunwhile
self.socket.settimeout(0.1)
Put 'ama bu kötü bir çözüm gibi görünüyor' Kısmen test - çalışır? İşletim Sisteminin tüm iş parçacıklarını sonlandırmasını istemiyorsanız, dinleme soketini ana veya diğer iş parçacığından kapatmayı deneyebilirsiniz. Bu genellikle accept() 'hata' ile 'erken' döndürmesine neden olur. Çoğu OS/dil üzerinde çalışır, ancak Python ile denemediğinden, bir yanıt vermez. –Çalışıyor - ama potansiyel müşterilere bunu yapmama konusunda çok iyi davranamadığımı hissediyorum. Kodun tamamlanmasına izin verdiği ölçüde daha güzel görünen bir çözüm gönderdim, ancak hemen katılmam gerekecek yeni bir süreç oluşturarak bitmesi garip görünüyor. – Norling