0

以下代码将指定的 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 对象?

4

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

但请注意,这是相当肮脏的黑客行为。更好的方法是扩展connect()子类中的方法HTTPConnection并重新定义http_open()子类中的方法HTTPHandler

于 2009-12-07T08:43:55.757 回答