2017-07-31 45 views
0

我在socket.gethostbyaddr()上玩得很開心,正在搜索如何加速一個非常簡單的代碼,它可以隨機生成一些IP地址並嘗試解決它們。問題來了,當沒有主機可以被發現,有一個超時時間可以很長(約10秒...)使用asyncore實現gethostbyaddr()

偶然,我發現這篇文章,他通過使用多線程解決了問題:https://www.depier.re/attempts_to_speed_up_gethostbyaddr/

我想知道是否有可能使用Asyncore做同樣的事情?這是我第一次嘗試這樣做,但悲慘地失敗了......

這裏是一個模板:

import socket 
import random 

def get_ip(): 
    a = str(random.randint(140,150)) 
    b = str(random.randint(145,150)) 
    c = str(random.randint(145,150)) 

    for d in range(100): 
     addr = a + "." + b + "." + c +"."+ str(1 + d) 
     yield addr 

for addr in get_ip():    
    try: 
     o = socket.gethostbyaddr(addr) 
     print addr + "...Ok :" 
     print "---->"+ str(o[0]) 
    except: 
     print addr + "...Nothing" 

回答

1

您正在尋找一種方式,怎麼把幾個IP地址轉換爲並行名(反之亦然)。基本上它是一個DNS請求/響應操作,並且gethostbyaddr正在同步執行此查找,即以阻止方式進行。它發送請求,等待響應,返回結果。

asyncio和類似的庫使用所謂的協同程序和協作調度。合作意味着編寫協程以支持協作。正在運行的協程顯式地將控制(使用await或yield from)返回給等待的調度程序,然後等待的調度程序選擇另一個協程並運行它,直到該程序返回控制等等。一次只能運行一個協程。對於平穩運行的協程,如果不返回控制,則不能長時間執行代碼。協程中的阻塞操作會阻止整個程序。這禁止使用gethostbyaddr

解決方案需要支持異步DNS查找。協程發送DNS請求,設置超時,安排將DNS響應傳遞給它並返回控件。因此,多個協程可以在等待所有響應之前一個接一個地發送它們的請求。

有異步DNS的第三方庫,但我從來沒有使用它們。看看aiodns的例子,看起來很容易編寫你正在尋找的代碼。 asyncore.gather可能是這種功能的核心。

+0

有用,謝謝! –