2009-12-07 4 views
0

다음 코드는 지정된 IP 주소를 주 프로그램의 소켓에 바인딩합니다.별도의 스레드에서 urllib2 객체와 다른 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 인스턴스가 실행되고 있다고 가정합니다. 각 urllib2 객체에 10 개의 다른 IP 주소를 바인딩하는 방법은 무엇입니까?

답변

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으로 확장하고 HTTPHandler의 서브 클래스에서 http_open() 메소드를 재정의하는 것입니다.