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)>

如果我只有一个线程,这很好用。但是,如果我有多个线程,则只使用一个 - 选择似乎是在程序启动时随机做出的。

我怀疑将线程标识符存储在 dict 中是问题所在,但它仍然适用于一个线程。

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 回答