pyqtSignal或带有线程计时器的队列以发出心跳信号?

时间:2018-08-20 12:37:58

标签: multithreading python-2.7 queue multiprocessing pyqt4

我正在尝试创建一个HeartBeat(threading._Timer)类,该类将在程序是否存在时通知主类。

我最初是试图利用PyQt4.QtCore的pyqtSignal,因为它很容易并且将来可能会用于更新GUI。但是我很难让pyqtSignal真正起作用。下面是我到目前为止使用pyqtSignal所做的事情,但是我无法使信号正常工作。

当时我当时想我应该利用这个机会来增强自己的multiprocessing.Queue技能。我希望大家能帮助我很好地掌握如何有效地将最佳方法用于此类任务。

我有四个易于重用的类:

from PyQt4.QtCore import pyqtSignal,QObject

class HeartBeatSignals(QObject):
    HeLives = pyqtSignal()
    HesDeadJim = pyqtSignal() 


import threading 
import time
import multiprocessing as mp

class HeartBeat(threading._Timer):
    def__init__(self,interval,function):
        super(HeartBeat,self).__init__(interval,function)
        self.signal = HeartBeatSignals()
    def run(self):
        while not self.finished.is_set():
            result = self.function.is_alive()
            self.finished.wait(self.interval)

            if result:
                print "He's Alive!"
                self.signal.HeLives.emit() 
            else:
                print "He's dead Jim.."
                self.signal.hesDeadJim.emit()

class Worker(object):
    def __init__(self):
        '''beep-boop'''

    def run(self):
        while True:
            print "working"
            time.sleep(1)

class WATCHDOG(object):
    def __init__(self):
        worker = Worker()
        self.w = mp.Process(target=worker.run)
        self.w.start()

        self.WorkerHeartBeat = HeartBeat(4.0,self.w)
        self.WorkerHeartBeat.start()

        self.WorkerHeartBeat.signal.HeLives.connect(self.dontcare)
        self.WorkerHeartBeat.signal.HesDeadJim.connect(self.death2Jim)

    def dontcare(self):
        print "..really don't care."

    def death2Jim(self):
        print "KAAAAHHNNN!!!!"


W = WATCHDOG()

我的初衷是让pyqtSignal通知主线程,然后重新启动该进程,并且也许在GUI上放一个指示灯,表明Process被终止,重新启动是一件好事。但是我想pyqtSignal不喜欢成为一个类的一部分。

我想我可以用multiprocessing.Queue或也许multiprocessing.Condition做同样的事情??

对于队列,我是否必须设置一个队列,该队列传递给我建立的每个工作人员心跳,然后在主循环中为每个q.get()创建一个while循环?

0 个答案:

没有答案