在不同线程中将不同IP地址绑定到urllib2对象

0 投票
1 回答
1236 浏览
提问于 2025-04-15 16:45

下面的代码将指定的IP地址绑定到主程序中的套接字上,作用是全局的。

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

假设主程序有10个线程,每个线程里都有一个urllib2的实例在运行。那怎么才能把10个不同的IP地址分别绑定到每个urllib2对象上呢?

1 个回答

1

你可以创建一个字典,把线程的标识符和IP地址对应起来,或者使用 threading.local() 这个全局对象来为每个线程定义它:

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

不过要注意,这种方法有点不太干净。更好的做法是,在 HTTPConnection 的子类中扩展 connect() 方法,并在 HTTPHandler 的子类中重新定义 http_open() 方法。

撰写回答