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?

War es hilfreich?

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
scroll top