ربط عناوين 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 يعمل داخل الخيط. كيفية ربط 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
.
لا تنتمي إلى StackOverflow