ربط عناوين IP المختلفة إلى كائن URLLIB2 في المواضيع المنفصلة

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 يعمل داخل الخيط. كيفية ربط 10 عناوين IP مختلفة لكل كائن Urllib2؟

هل كانت مفيدة؟

المحلول

يمكنك تحديد معرف رسم الخرائط في القاموس عنوان 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