0

Python でスレッド化を使用して複数の telnet ホストに接続したいのですが、解決できない問題に遭遇しました。

MAC OS X Lion / Python 2.7 で次のコードを使用する

import threading,telnetlib,socket

class ReaderThread(threading.Thread):
    def __init__(self, ip, port): 
        threading.Thread.__init__(self)
        self.ip = ip
        self.port = port
        self.telnet_con = telnetlib.Telnet()

    def run(self):
        try:
            print 'Start %s' % self.ip
            self.telnet_con.open(self.ip,self.port,30)
            print 'Done %s' % self.ip
        except socket.timeout:
            print 'Timeout in %s' % self.ip

    def join(self):
        self.telnet_con.close()

ta = []

t1 = ReaderThread('10.0.1.162',9999)
ta.append(t1)
t2 = ReaderThread('10.0.1.163',9999)
ta.append(t2)

for t in ta:
    t.start()
print 'Threads started\n'

一般的には機能しますが、いずれかのスレッド (常に同じであるとは限りません) の接続に時間がかかります (約 20 秒、タイムアウトになることもあります)。その非常に長い接続時間中 (すべてローカル ネットワークで)、CPU 負荷も 100% に達します。

さらに奇妙なのは、配列内のスレッドを 1 つだけ使用している場合、常に問題なく動作するという事実です。したがって、複数のスレッドの使用と関係があるに違いありません。

DNS ルックアップの問題を回避するために、すべての IP アドレスにホスト名エントリを追加しました。これは違いはありませんでした。

よろしくお願いします。

よろしくお願いします

セネキシ

4

1 に答える 1

0

わかりました、join() をオーバーライドしましたが、それを行うべきではありません。メイン スレッドは、コードの最後の行の直後に終了するときに、各スレッドで join() を呼び出します。telnet スレッドが実際に終了する前に join() メソッドが戻るため、Python は混乱して join() を再度呼び出そうとします。これが 100% の CPU 使用率の原因です。join() メソッドに「print」ステートメントを入れてみてください。

join() の実装はソケットを閉じようとします (おそらく、他のスレッドがまだ接続を開こうとしている間に)。これが原因で、telnet スレッドが終了しない可能性があります。

于 2011-12-21T21:52:50.543 に答える