direcciones IP diferentes se unen a urllib2 objeto en hilos separados
-
13-09-2019 - |
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?
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