2017-07-31 3 views
0

私はsocket.gethostbyaddr()で楽しい時を過ごしていました。問題が発生するのは、ホストが見つからない場合、タイムアウトが実際に長くなることがある(約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から使用して待機中のスケジューラに返します。このスケジューラは別のコルーチンを選択し、制御を返すまで実行します。一度に実行できるコルーチンは1つだけです。円滑な実行のために、コルーチンは、コントロールを返さずに、より長い時間コードを実行してはいけません。コルーチンのブロッキング操作は、プログラム全体をブロックします。これはgethostbyaddrの使用を禁止しています。

ソリューションには、非同期DNSルックアップのサポートが必要です。コルーチンはDNS要求を送信し、タイムアウトを設定し、DNS応答が渡されて制御を返すように調整します。したがって、複数のコルーチンは、すべての応答を待つ前に、次々に要求を送信できます。

非同期DNSのサードパーティライブラリがありますが、私は一度も使用していません。 aiodnsの例を見ると、探しているコードを書くのはかなり簡単です。 asyncore.gatherはおそらくそのような機能の核心になるでしょう。

+0

便利、ありがとう! –

関連する問題