2015-04-21 4 views
0

J'essaie de créer une application qui exécutera un script bash toutes les 10 minutes. J'utilise apscheduler pour accomplir ceci et quand je cours mon code du terminal cela fonctionne comme le travail d'horloge. Cependant quand j'essaye d'exécuter le code d'un autre module il se bloque je soupçonne que le module appelant attend que le module de "programme" finisse et plante alors quand cela n'arrive jamais.Le programme Python BackgroundScheduler plante quand il est exécuté depuis un autre module

Code d'erreur

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

shell returned 137 

fonction qui appelle le calendrier

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

Horaire Programme

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() 

ce programme appelle simplement une autre jamais 10 minutes. En guise de note, j'ai essayé de rester aussi loin de multi-threading que possible, mais si cela est nécessaire, soit.

Répondre

0

Eh bien, j'ai réussi à comprendre moi-même. Le problème que GTK + n'est pas thread-safe donc le module chronométré doit être exécuté dans un autre thread ou bien vous pouvez réaliser/entrer le thread avant/après l'appel du module.

Je l'ai fait comme ça.

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() 

Cet article le passe en revue plus en détail. J'espère que quelqu'un d'autre le trouvera utile. http://blogs.operationaldynamics.com/andrew/software/gnome-desktop/gtk-thread-awareness