2011-12-21 2 views
0

Pythonでスレッドを使用して複数のTelnetホストに接続したいが、私は解決できない問題について遭遇した。Pythonで複数のtelnet接続スレッドを使用するとタイムアウトと高いCPU負荷の問題が発生する

MAC OS Xライオン/ 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アドレスのホスト名エントリを既に追加しました。これは違いはありませんでした。

ご協力いただきありがとうございます。

敬具

senexi

+0

誤動作しているスレッドのスタックトレースを取得して、どこにスタックされているかを確認する方法はありますか? – NPE

+0

"traceback.print_stack()"をインクルードしましたが、新しい情報は表示されませんでした。 telnet_con.open()で常にハングします。私もスレッドを使わないでバージョンを試しました。それでも接続を確立するのに時間がかかりますが、CPU負荷がそれ以上上がらないという問題があります。残念ながら、私は自分のアプリケーションでスレッドを使用する必要があります... -/ – senexi

答えて

0

[OK]を、あなたが上書きされている)は(参加、そしてあなたはそれを行うことになっていません。メインスレッドは、メインスレッドが終了したときに各スレッドのjoin()を呼び出します。これはコードの最後の行の直後です。あなたのtelnetスレッドが実際に終了する前にjoin()メソッドが返ってくるので、Pythonは混乱してjoin()をもう一度呼び出そうとします。これが100%cpuの使用を引き起こします。あなたのjoin()メソッドに 'print'ステートメントを入れてみてください。

あなたの実装ではソケットを閉じようとしています(おそらく他のスレッドがまだ接続を開こうとしている間)、これはあなたのtelnetスレッドが決して終わらない原因になるかもしれません。

+0

すごく、あなたは参加方法とCPU使用量に関して絶対に正しいです。どうもありがとう。私が今日見つけたもう一つの問題は、接続しようとしていた2つのTelnetデバイスのMACアドレス設定が間違っていたことです。私はこの問題が解決されたと思う;-) – senexi

関連する問題