2009-12-07 32 views
0

以下代碼將全局指定的ip地址綁定到主程序中的套接字。在不同的線程中將不同的ip地址綁定到urllib2對象

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

可以定義一個字典映射線程標識符到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()方法。

相關問題