Bind verschiedene IP-Adressen-Objekt in getrennten Threads urllib2
-
13-09-2019 - |
Frage
Der folgende Code bindet angegebene IP-Adresse global in Hauptprogramm an der Steckdose.
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind((sourceIP, 0))
return sock
socket.socket = bound_socket
Angenommen Hauptprogramm hat 10 Fäden, von denen jeder mit einer urllib2 Instanz innerhalb des Thread ausgeführt wird. Wie 10 verschiedene IP-Adressen an jedes urllib2 Objekt binden?
Lösung
Sie können ein Wörterbuch Mapping Thread-Kennung zu IP-Adresse definieren oder threading.local()
globales Objekt verwenden, es zu definieren pro Thema:
socket_data = threading.local()
socket_data = bind_ip = None
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
if socket_data.bind_ip is not None:
sock.bind((socket_data.bind_ip, 0))
return sock
socket.socket = bound_socket
def thread_target(bind_ip):
socket_data.bind_ip = bind_ip
# the rest code
for bind_ip in [...]:
thread = Thread(target=thread_target, args=(bind_ip,))
# ...
Aber Achtung, das ist ziemlich schmutzig Hack. Ein besserer Weg ist connect()
Methode in der Unterklasse von HTTPConnection
zu erweitern und http_open()
Methode in der Unterklasse von HTTPHandler
neu zu definieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow