別のスレッドでurllib2のオブジェクトに異なるIPアドレスをバインド
-
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