Python使用多线程概念通过dbus信号引发异常
我有一个特别的问题Python使用多线程概念通过dbus信号引发异常,python,multithreading,exception,multiprocessing,dbus,Python,Multithreading,Exception,Multiprocessing,Dbus,我有一个特别的问题 程序的主要内容从创建dbus循环的过程开始,在这里我监听信号 我存储在队列中的信号内容。在main的下一部分中,我有一个线程池 当某个线程从队列中获取项目时,它使用特定的函数(检测)来处理基于队列中项目内容的请求。(有对数据库的操作,从中获取数据并根据请求进行一些操作) 线程池中的每个线程都会启动一个以上的线程,该线程应该处理信号(当前状态和中断) 例如:我收到信号,这意味着我必须处理一些数字上的事情。来自threadpool的任何线程都会从队列中获取此项,并启动处理数字上的
threads\u init()
)SERVICE = multiprocessing.Process(target=dbus_signal_receiver, args=(...))
SERVICE.daemon = True
SERVICE.start()
class worker(threading.Thread):
def __init__(self,...):
threading.Thread.__init__(self)
def run(self):
while True:
#get item from queue
s = threading.Thread(target=curr_and_interr_signal_handle, args=(ID of item from queue,...))
s.daemon = True
s.start()
#start specific detection based on request
for i in range(number of threads):
t = worker(...)
t.daemon = True
t.start()
我希望,像这样的事情会奏效。。。(但事实并非如此)
阅读有关Python信号处理程序始终在Python主线程中执行, 即使信号是在另一个线程中收到的。
这意味着信号不能用作线程间通信的手段。
您可以改用线程模块中的同步原语。
此外,只允许主线程设置新的信号处理程序 阅读有关
这是线程间通信的最简单机制之一:一个线程发出事件信号,其他线程等待事件
不清楚为什么必须在线程中使用
线程
为什么您的
工作线程不能处理检测
例如,应执行以下操作:
def run(self):
while self.running.is_set():
#get item from queue
#start specific detection based on request
我使用线程中的线程,因为我在线程池中得到的队列中的每个项目(请求)都有自己的唯一ID。因此线程池中的每个线程都会启动线程以处理来自D-Bus的关于检测当前状态的信号,并中断以停止处理ID为的请求。当中断时,线程中的stop函数处理此ID,并继续从队列中获取另一项(请求)。例如:I get D-Bus signal,表示ID为55的中断请求。因为这个线程-s=threading.thread(target=curr\u和\u interr\u signal\u handle,args=(…)
-在开始时从队列中获取项目的ID,如果队列中实际处理项的ID与信号中断请求ID相同,则可能引发任何异常。但我无法正确捕获引发的异常。您有更好的处理方法吗?@M.Ohio:阅读您的评论并不能让我理解您为什么会引发任何异常。但不管怎样,我已经更新了我的答案。你知道D-Bus吗?它的控制总线用于应用程序之间的通信。我的应用程序从D总线获取信号(消息),必须接收它们并基于od类型处理它。若它是请求ID=X的项目的当前状态,我的应用程序将以其ID的百分比发送实际状态。若它是消息,这意味着ID=X的中断项目,所以在处理中断消息和项目ID与接收到的相同的线程中,我必须停止执行检测并等待队列中的另一个项目。检测意味着对象,它在巨大的数据集上操作一些东西。也许这更容易用。。。
def run(self):
while self.running.is_set():
#get item from queue
#start specific detection based on request