Python通过多线程概念提高了DBUS信号的异常



我有一个特定的问题。

  1. 程序的主要内容始于使用DBU循环创建过程,我在其中收听信号。
  2. 我存储在队列中的信号的内容。在Main的下一部分中,我有一个ThreadPool。
  3. 当某些线程从队列中获取项目时,它会根据队列中的项目内容使用特定功能(检测(来处理请求。(数据库上有操作,从我获取数据并进行一些操作取决于请求(
  4. 线程池中的每个线程都会启动另一个线程,该线程应处理信号(当前状态和中断(。

例如:我接收信号,这意味着我必须在数字上处理一些东西。来自ThreadPool的任何线程都从队列中获取此项目并启动在数字上处理某些内容的功能 - 可能需要很长时间。因此,在任何时候,我都会收到当前状态的信号,并且需要发送检测的当前状态 - 这就是为什么我使用线程(用于共享内存(的原因。另外,我可以从D-Bus接收中断信号("花费太长,因此请停止此检测并免费获得其他请求"(。中断是主要问题...

所以我的主要问题是:

  1. 有什么办法,我可以提出中断信号和停止功能(检测(的例外吗?(我刚刚找到解决方案,但仅是为了捕获,但是我需要在线程池中捕获它,然后在线程中抬起线程中的线程中的线程(
  2. (
  3. 第二个问题是关于吉尔的...我带有信号接收的线程是否接收所有信号?我认为不是...(是的,我使用threads_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()

我希望,这样的事情会起作用...(但事实并非如此(

...
class worker(threading.Thread):
    def __init__(self,...):
        threading.Thread.__init__(self)
    def run(self):
        while True:
            try:
                #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
            except raised_interrupt_exception:
                #continue - wait for another request from queue

...

阅读大约18.8.1.2。信号和线程
Python信号处理程序始终在主Python线程中执行 即使在另一个线程中收到信号。
这意味着信号不能用作线际间交流的一种手段。
您可以改用螺纹模块中的同步原始图。
此外,仅允许主线程设置一个新的信号处理程序。

阅读大约17.1.7。事件对象
这是线程之间通信的最简单机制之一:一个线程信号和其他线程等待


不清楚为什么您必须使用thread in thread
为什么您的worker thread无法处理检测?

例如,以下是这样做的:

def run(self):
    while self.running.is_set():
        #get item from queue
        #start specific detection based on request

最新更新