Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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使用多线程概念通过dbus信号引发异常_Python_Multithreading_Exception_Multiprocessing_Dbus - Fatal编程技术网

Python使用多线程概念通过dbus信号引发异常

Python使用多线程概念通过dbus信号引发异常,python,multithreading,exception,multiprocessing,dbus,Python,Multithreading,Exception,Multiprocessing,Dbus,我有一个特别的问题 程序的主要内容从创建dbus循环的过程开始,在这里我监听信号 我存储在队列中的信号内容。在main的下一部分中,我有一个线程池 当某个线程从队列中获取项目时,它使用特定的函数(检测)来处理基于队列中项目内容的请求。(有对数据库的操作,从中获取数据并根据请求进行一些操作) 线程池中的每个线程都会启动一个以上的线程,该线程应该处理信号(当前状态和中断) 例如:我收到信号,这意味着我必须处理一些数字上的事情。来自threadpool的任何线程都会从队列中获取此项,并启动处理数字上的

我有一个特别的问题

  • 程序的主要内容从创建dbus循环的过程开始,在这里我监听信号
  • 我存储在队列中的信号内容。在main的下一部分中,我有一个线程池
  • 当某个线程从队列中获取项目时,它使用特定的函数(检测)来处理基于队列中项目内容的请求。(有对数据库的操作,从中获取数据并根据请求进行一些操作)
  • 线程池中的每个线程都会启动一个以上的线程,该线程应该处理信号(当前状态和中断)
  • 例如:我收到信号,这意味着我必须处理一些数字上的事情。来自threadpool的任何线程都会从队列中获取此项,并启动处理数字上的某些内容的函数—这可能需要很长时间。所以在任何时候之后,我都会收到当前状态的信号,我需要发送当前的检测状态——这就是为什么我使用线程(用于共享内存)。我还可以从D-Bus接收中断信号(“它花费的时间太长了,所以停止此检测并自由地接受另一个请求”)。中断是主要的问题

    因此,我的主要问题是:

  • 有没有办法,我可以提出异常的中断信号和停止功能(检测)?(我刚刚找到了解决方案,但只针对main中的catch…但我需要在threadpool中的线程中捕捉它,并在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