我的代码产生了许多线程来管理与许多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中是个问题,但仍然可以使用一个线程。
答案 0 :(得分:0)
您可以预先实例化一个线程池,而不是将您的线程存储在一个“简单”的关联数组中(您可以在这里找到一个实现示例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个链接......