结合不同的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