문제

다음 코드는 전 세계 메인 프로그램에서 지정된 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 주소를 바인딩하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

사전 매핑 스레드 식별자를 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top