別のスレッドでurllib2のオブジェクトに異なるIPアドレスをバインド

StackOverflow https://stackoverflow.com/questions/1858310

  •  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メソッドを再定義することである。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top