2017-04-17 4 views
0

Ich habe ein Multithreading-Programm, das 5 Socket-Objekte instanziiert wie folgt:Python Wie schließe ich einen in einem Thread instanziierten Socket?

class myThread (threading.Thread): 
    def __init__(self, pid, port_num, restart): 
     threading.Thread.__init__(self) 
     self.hostname = '127.0.0.1' 
     self.pid = pid 
     self.port_num = port_num 
     self.ID = pid 
     self.restart = restart 
     self.delay = pid*4*1000 

    def run(self): 
     try: 
      s = timer(self.hostname, self.port_num, self.pid) 
      #print "Socket S run"+str(s) 
      sendToSocket(self.pid, s, self.t, self.ID) 
     except Exception as e: 
      raise 

Hier kann die Funktion timer wird verwendet, um einen Faden auf die folgende Weise zu instantiieren:

def timer(host, port, pid): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    timed = pid * 4 * 100 
    s.settimeout(timed) 
    s.bind((host, port)) 
    s.listen(5) 
    return s 

Ich möchte ein von beenden die Sockets an einem bestimmten Port sagen 5005. Die PID im obigen Beispiel geht von 5001 bis 5005.

Ich möchte eine Steckdose zwischendurch abschalten - sagen wir 5005.

So habe ich diese Methode:

s = socket.socket() 
s.connect(('127.0.0.1', 5005)) 
s.close() 

Aber der Sockel wird nicht geschlossen.
Ich muss den obigen Vorgang von einer externen Funktion aufrufen.

Kurz gesagt, wenn ein Socket an Port 5005 gebunden ist, möchte ich die Steckdose schließen und es nicht zur Verfügung, so dass wir eine bekommen würde Port not found exception.

+0

Mögliche Duplikat [Schließen Socket in Python thread] (http://stackoverflow.com/questions/16734534/close-listening-socket-in-python-thread) – Dillanm

+0

Als your'class 'halten MyThread das '.port_num', funktioniert' myThread_instance.s.close() 'nicht? – stovfl

Antwort

1

Sie ein Wörterbuch mit Port als Schlüssel machen könnte und Steckdose als Wert.

my_sockets = {} 

Dann werden alle Ihre neue Buchsen in diesem Wörterbuch im run oder timer Funktion hinzufügen, zum Beispiel:

def timer(host, port, pid): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    timed = pid * 4 * 100 
    s.settimeout(timed) 
    s.bind((host, port)) 
    s.listen(5) 
    my_sockets[port] = s 
    return s 

schließlich eine Funktion machen zu schließen und entfernen Steckdosen aus diesem Wörterbuch.

def close_socket(port): 
    if port in my_sockets : 
     my_sockets[port].close() 
     my_sockets.pop(port) 
Verwandte Themen