0

我正在尝试构建一个每 10 分钟运行一次 bash 脚本的应用程序。我正在使用 apscheduler 来完成此任务,当我从终端运行我的代码时,它就像时钟一样工作。但是,当我尝试从另一个模块运行代码时,它崩溃了,我怀疑调用模块正在等待“计划”模块完成,然后在这种情况永远不会发生时崩溃。

错误代码

/bin/bash: line 1: 13613 Killed                  ( python ) < /tmp/vIZsEfp/26

shell returned 137   

调用调度的函数

   def shedual_toggled(self,widget):
            prosessSchedular.start_background_checker()

安排节目

def schedul_check(): 
    """set up to call prosess checker every 10 mins"""
    print "%s check ran" %(counter) 
    counter =+ 1

    app = prosessCheckerv3.call_bash() < calls the bash file
    if app == False:
        print "error with bash" 
        return False 
    else:
        prosessCheckerv3.build_snap_shot(app)


def start_background_checker():
    scheduler = BackgroundScheduler()
    scheduler.add_job(schedul_check, 'interval', minutes=10)
    scheduler.start()

    while True:
        time.sleep(2)


if __name__ == '__main__':
    start_background_checker()   

该程序仅调用另一个 10 分钟。作为旁注,我一直试图尽可能远离多线程,但如果需要,那就这样吧。

4

1 回答 1

0

好吧,我设法弄清楚了我自己。GTK+ 不是线程安全的问题,因此定时模块需要在另一个线程中运行,否则您可以在调用模块之前/之后实现/进入线程。

我就是这样做的。

def shedual_toggeld(self,widget):
        onOffSwitch = widget.get_active()

        """ After main GTK has logicly finished all GUI work run thread on toggel button """
        thread = threading.Thread(target=self.call_schedual, args=(onOffSwitch,))
        thread.daemon = True
        thread.start()



    def call_schedual(self, onOffSwitch):
        if onOffSwitch == True:
            self.sch.start_background_checker()
        else:
            self.sch.stop_background_checker() 

本文更详细地介绍了它。希望其他人会发现这很有用。 http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness

于 2015-04-26T13:49:58.170 回答