繁体   English   中英

Python通过具有多线程概念的dbus信号引发异常

[英]Python raise exception by dbus signal with multithreading concept

我有一个特定的问题。

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

例如:我收到信号,这意味着我必须处理数字。 线程池中的任何线程都将从队列中取出该项目并启动处理数字上某些内容的功能-这可能需要很长时间。 因此,在任何时间之后,我都会收到有关当前状态的信号,并且需要发送检测的当前状态-这就是为什么我使用线程(用于共享内存)。 我还可以从D-Bus接收中断信号(“时间太长,请停止此检测,并可以接受其他请求”)。 而中断是主要问题...

所以我的主要问题是:

  1. 有什么办法可以在中断信号和停止功能(检测)上引发异常? (我刚刚找到了解决方案,但仅用于在main中捕获...但是我需要在线程池中的线程中捕获它,并在线程池中的线程中引发线程)
  2. 第二个问题是关于GIL的。接收信号的线程是否接收所有信号? 我认为没有...(是的,我使用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使用thread in thread
为什么您的worker thread无法处理检测?

例如,应该执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM