Python:从后台进程

时间:2017-09-22 05:03:30

标签: python flask background-process

我遇到了一些问题,到目前为止,我的许多测试/搜索都让我无处可去。

我有一个Flask应用程序,为在树莓派上运行的小型警报系统提供GUI。 GUI允许启动警报(目前GPIO引脚上的运动传感器)作为后台进程。运行正常,如果检测到它发送电子邮件。 我正在尝试添加一种会发出警笛声的方法(或100分贝的黑金属歌曲,尚未决定:p)。 方法本身在一个类中并且工作正常,我可以从GUI激活/停用它作为另一个后台进程。

但是,我无法通过警报程序自动触发它。不知道为什么,我没有错误,它只是不解雇:

class Alarm(Process):

  def __init__(self):
      super().__init__()
      self.exit = Event()


  def shutdown(self):
      self.exit.set()

  def run(self):

      Process.__init__(self)

      #code
      #if motion detected sendmail, and run the siren:

      siren = Siren()  #actually, problem here: I need to import the class 
                       #and declare this in the main Flask app file, so as 
                       #to be able to control it from the GUI. Apparently I 
                       #can't declare it in both python files (sounds 
                       #obvious though)
      siren.start()

      #then keep looping

和Siren类相似:

class Siren(Process):
    def __init__(self):
        super().__init__()

    def run(self):

        Process.__init__(self)

        #code using pyaudio

我猜我对类和方法的基本理解是罪魁祸首。 我也尝试过使用事件,所以我没有使用siren.start()e = Event()来代替e.set(),但是我无法在后台运行Siren类。让它用e.wait()选择该事件。

任何人都可以指出我正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您不应该从Process.__init__致电Alarm.run!您已经在Alarm.__init__

中执行此操作

Process.__init__(self)super().__init__()

完全相同

<强>更新

这有用吗:

import threading
import time

class Alarm(threading.Thread):



    def run(self):

        #code
        #if motion detected sendmail, and run the siren:

        siren = Siren()  #actually, problem here: I need to import the class 
                         #and declare this in the main Flask app file, so as 
                         #to be able to control it from the GUI. Apparently I 
                         #can't declare it in both python files (sounds 
                         #obvious though)
        siren.start()


        #then keep looping
        for x in range(20):
            print ".",
            time.sleep(1)
        siren.term()
        siren.join()



class Siren(threading.Thread):

    def run(self):

        self.keepRunning=True;

        while self.keepRunning:
            print "+",
            time.sleep(1)

    def term(self):
        self.keepRunning=False

if __name__ == '__main__':
    alarm = Alarm()
    alarm.run()

输出:

+. + . .+ . + +. +. . + . + . + . + + . + . + . + . + . + . + . + . +. +. +