答案 0 :(得分:2)
如果您正在询问如何确保每15秒启动一次连接,即使每个连接可能需要几秒钟(甚至可能超过15秒),这也很容易。由于你每15秒只进行一次连接,所以没有理由不为每个连接生成一个线程。
所以:
def connectToSiteFunction(ip):
# your code to bind ip (if it's a source) or connect to it (if it's a dst)
# and do your thing here
def connectAndWait():
for ip in ips:
t = threading.Thread(target=connectToSiteFunction, args=(ip,))
yield t
t.start()
os.sleep(15)
threads = [t for t in connectAndWait()]
for t in threads:
t.join()
如果您正在谈论目标IP,并且您想知道如何为每个请求使用不同的...那么,您通常只需修改URL。像这样:
def connectToSiteFunction(ip):
url = 'http://{}/path/to/page.html'.format(ip)
# now open url as normal
如果你问如何将源地址绑定到你选择的URL下载库,你必须告诉我们哪个库,但是:库中是否有一个参数,或者它有一个方法你可以指定一个socket
工厂,或者这是不可能的(除非你想用你自己的工厂monkeypatch socket.socket
)。如果它允许您指定socket
工厂,那么执行此操作的方法是:
def make_socket_factory(srcip):
def socket_factory():
s = socket.socket()
s.bind((srcip, 0))
return s
return socket_factory
然后只需将make_socket_factory(srcip)
作为工厂传递。
如果您想知道如何首先下载网址...有很多方法可以做到这一点,从stdlib urllib2
到requests
和pycurl
到{ {1}},在SO(以及其他地方)已经有很多答案可以比较和对比它们。