분리 된 스레드에서 다른 IP 주소를 urllib2 객체에 바인딩
-
13-09-2019 - |
문제
다음 코드는 전 세계 메인 프로그램에서 지정된 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
.
제휴하지 않습니다 StackOverflow