【问题标题】:Bind different ip addresses to urllib2 object in seperate threads在不同的线程中将不同的 ip 地址绑定到 urllib2 对象
【发布时间】:2009-12-07 06:58:58
【问题描述】:

以下代码将指定的ip地址全局绑定到主程序中的socket。

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 地址?

【问题讨论】:

    标签: python ip-address urllib2


    【解决方案1】:

    您可以定义字典映射线程标识符到 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,))
        # ...
    

    但请注意,这是相当肮脏的黑客行为。更好的方法是在HTTPConnection 的子类中扩展connect() 方法并在HTTPHandler 的子类中重新定义http_open() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      相关资源
      最近更新 更多