Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在线程中调用方法_Python_Multithreading_Methods - Fatal编程技术网

Python 在线程中调用方法

Python 在线程中调用方法,python,multithreading,methods,Python,Multithreading,Methods,我的代码生成了许多线程来管理与许多I/O板的通信。通常,线程从板接收事件,并根据需要更新外部数据源。线程(1个或多个)的调用方式如下: phThreadDict[devId] = ifkit(self, phDevId, phIpAddr, phIpPort, phSerial) phThreadDict[devId].start() 这个很好用。但是,在某些情况下,我还需要线程向板发送消息。线程包含一个执行该工作的方法,我从主线程调用该方法,如下所示:(本例打开数字输出) 这是线程中包含的方

我的代码生成了许多线程来管理与许多I/O板的通信。通常,线程从板接收事件,并根据需要更新外部数据源。线程(1个或多个)的调用方式如下:

phThreadDict[devId] = ifkit(self, phDevId, phIpAddr, phIpPort, phSerial)
phThreadDict[devId].start()
这个很好用。但是,在某些情况下,我还需要线程向板发送消息。线程包含一个执行该工作的方法,我从主线程调用该方法,如下所示:(本例打开数字输出)

这是线程中包含的方法:

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)>}
{134997634:,554878244:,407897606:}
例如:

<ifkit(Thread-3, started daemon)>

如果我只有一根线,这个就可以了。但是,如果我有多个线程,那么只使用一个线程——当程序启动时,选择似乎是随机的


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

与其将线程存储在“简单”关联数组中,不如事先实例化一个线程池(您可以在这里找到一个实现示例h**p://code.activestate.com/recipes/577187-python-thread-pool/或直接使用以下库)

同时实例化一个“看门狗”,你的每个线程都会持有一个对此看门狗的引用,因此当你的线程需要回调时,它们会将信息发回给这个看门狗。(注意死锁,请参阅)


注意:很抱歉使用了蹩脚的“h**p”,但我不会发布超过2个链接。…

谢谢,第一个线程池链接似乎是正确的方向。但是,我没有看到(或缺少)的是如何让主程序调用特定线程中的线程。事实上,线程池状态为:“[threadpool]通过将作业放入工作请求队列,将作业分配给线程,然后由下一个可用线程接收。“在我的应用程序中,线程特定于物理外部I/O板,因此必须在正确的thread.Bump中调用该方法。真的,对此没有想法吗?
<ifkit(Thread-3, started daemon)>