Pregunta

El siguiente código se une dirección IP especificada a la toma en el programa principal a nivel mundial.

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

Supongamos programa principal tiene 10 hilos, cada uno con una instancia de urllib2 se ejecuta dentro de la rosca. Cómo enlazar 10 direcciones IP diferentes para cada objeto urllib2?

¿Fue útil?

Solución

Se puede definir un identificador de hebra mapeo diccionario a la dirección IP o el uso de objetos threading.local() mundial para definirlo por hilo:

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,))
    # ...

Pero tenga en cuenta, que es bastante truco sucio. Una mejor manera es extender método connect() en la subclase de HTTPConnection y redefinir http_open() método en la subclase de HTTPHandler.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top