2015-04-21 6 views
0

Я пытаюсь создать приложение, которое будет запускать скрипт bash каждые 10 минут. Я использую apscheduler для выполнения этого, и когда я запускаю свой код из терминала, он работает как работа с часами. Однако, когда я пытаюсь запустить код из другого модуля, он сбой, я подозреваю, что вызывающий модуль ждет завершения модуля «расписание», а затем сбой, когда этого не произойдет.Программа Python BackgroundScheduler сбой при запуске из другого модуля

Код ошибки

/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 минут. В качестве побочной заметки я старался оставаться как можно дальше от многопоточности, но если это необходимо, пусть будет так.

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^