Python BackgroundScheduler程序从另一个模块运行时崩溃

时间:2015-04-21 19:10:53

标签: python multithreading gtk pygtk apscheduler

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

错误代码

/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分钟。作为旁注,我一直试图尽可能远离多线程,但如果需要的话,那就这样吧。

1 个答案:

答案 0 :(得分: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