1

私のコードは、多数の I/O ボードとの通信を管理するために多数のスレッドを生成します。通常、スレッドはボードからイベントを受け取り、必要に応じて外部データ ソースを更新します。スレッド (1 つ以上) は次のように呼び出されます。

phThreadDict[devId] = ifkit(self, phDevId, phIpAddr, phIpPort, phSerial)
phThreadDict[devId].start()

これはうまくいきます。ただし、ボードにメッセージを送信するためにスレッドが必要な場合もあります。スレッドには作業を行うメソッドが含まれており、メインスレッドから次のようにそのメソッドを呼び出します: (この例ではデジタル出力をオンにします)

phThreadDict[devId].writeDigitalOutput(digitalOut, True)

これは、スレッドに含まれるメソッドです。

def writeDigitalOutput(self,index, state):
    interfaceKit.setOutputState(index, state)

threading.enumerate()生成:

{134997634: <ifkit(Thread-1, started daemon)>, 554878244: <ifkit(Thread-3, started daemon)>, 407897606: <tempsensor(Thread-4, started daemon)>}

インスタンスは次のとおりです。

<ifkit(Thread-3, started daemon)>

スレッドが 1 つしかない場合、これは正常に機能します。しかし、複数のスレッドがある場合、使用されるのは 1 つだけです。選択は、プログラムの開始時にランダムに行われるように見えます。

スレッド識別子をdictに格納することが問題だと思いますが、それでも1つのスレッドで動作します。

4

1 に答える 1

1

スレッドを「単純な」連想配列に格納する代わりに、事前にスレッドプールをインスタンス化する必要があります (ここで実装の例を見つけることができます h**p://code.activestate.com/recipes/577187-python-thread-pool / または次の lib http://pypi.python.org/pypi/threadpoolを直接使用します)。

また、「ウォッチドッグ」をインスタンス化します。各スレッドはこのウォッチドッグへの参照を保持するため、スレッドがコールバックを実行する必要がある場合、スレッドはこのウォッチドッグに情報を送り返します。(デッドロックに注意してください。 http://dabeaz.blogspot.fr/2009/11/python-thread-deadlock-avoidance_20.htmlを参照してください)。

注:不自由な「h ** p」で申し訳ありませんが、2つ以上のリンクを投稿することはできません....

于 2012-10-01T07:26:30.130 に答える