0

次のコードは、指定された 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アドレスをバインドする方法は?

4

1 に答える 1

1

スレッド ID を 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

于 2009-12-07T08:43:55.757 に答える