AP Scheduler - Cannot schedule new tasks after shutdown

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

Hallo zusammen,

ich bastle an einen kleinen Testprogramm, was auf Basis einer gegebenen TestSuite einen Test startet und steuert. Ein TestCase definiert dabei eine Reihe von Operationen über die einen VM gesteuert wird. Dazu habe ich ne kleine Klasse gebastelt:

Code: Alles auswählen

class TestScheduler(object):

    def __init__(self, config):
        """
        Creates a test scheduler instance. The param config is a instance of
        the class configreader.
        """

        self._config = config
        self.scheduled_jobs = 0
        self._scheduler = Scheduler()
        atexit.register(lambda: self._scheduler.shutdown(wait=False))
        self._is_running = False

    def create_schedule(self, test_case):

        if not self._is_running :
            self.start()

        command = "VBoxManage controlvm %s setlinkstate1 %s"

        now = datetime.datetime.now()

        print "created jobs ..."

        for operation in test_case.operations:

            #create the task
            job_command = command % (operation.vm_name, operation.link_state)
            job_start_time = now + datetime.timedelta(minutes = int(operation.time))
            self._scheduler.add_date_job(self.job, job_start_time, [job_command])
            self.scheduled_jobs+=1

        self._scheduler.print_jobs()

    def job(self, job_command):
        print "\nexecute: " + job_command
        self.scheduled_jobs-=1
....
Gesteuert wird der Ablauf des Testprogrammes im wesentlichen über folgende Zeilen:

Code: Alles auswählen

for test_case in self._test_suite.test_cases:

                tscheduler.create_schedule(test_case);

                #run test_case
                while tscheduler.remaining_jobs():
                    sleep(self._config.getfloat("General", "TEST_SUITE_VM_CONTROL_TIMEOUT"))
                    sys.stdout.write('.'); sys.stdout.flush()

                tscheduler.stop()

                self.collect_measurements()
                number_of_test_cases-=1

Der einmalige Durchlauf funktioniert ohne Probleme. Hat die TestSuite aber mehrere TestCases, so bekomme ich folgenden Fehler:

Code: Alles auswählen

start scheduler ...
created jobs ...
Jobstore default:
    TestScheduler.job (trigger: date[2013-12-29 14:14:01.451742], next run at: 2013-12-29 14:14:01.451742)
    TestScheduler.job (trigger: date[2013-12-29 14:15:01.451742], next run at: 2013-12-29 14:15:01.451742)
    TestScheduler.job (trigger: date[2013-12-29 14:16:01.451742], next run at: 2013-12-29 14:16:01.451742)
    TestScheduler.job (trigger: date[2013-12-29 14:16:01.451742], next run at: 2013-12-29 14:16:01.451742)
.....
execute: VBoxManage controlvm host1 setlinkstate1 off
......
execute: VBoxManage controlvm host2 setlinkstate1 off
......
execute: VBoxManage controlvm host1 setlinkstate1 on

execute: VBoxManage controlvm host2 setlinkstate1 on
.
stop scheduler ...
Collecting measurements from all vms based on JGroups
Reset vms ...
Stoping the machines ... 
Starting the machines ... 
start scheduler ...
created jobs ...
Jobstore default:
    TestScheduler.job (trigger: date[2013-12-29 14:17:11.826853], next run at: 2013-12-29 14:17:11.826853)
    TestScheduler.job (trigger: date[2013-12-29 14:18:11.826853], next run at: 2013-12-29 14:18:11.826853)
    TestScheduler.job (trigger: date[2013-12-29 14:19:11.826853], next run at: 2013-12-29 14:19:11.826853)
    TestScheduler.job (trigger: date[2013-12-29 14:20:11.826853], next run at: 2013-12-29 14:20:11.826853)
    TestScheduler.job (trigger: date[2013-12-29 14:21:11.826853], next run at: 2013-12-29 14:21:11.826853)
    TestScheduler.job (trigger: date[2013-12-29 14:22:11.826853], next run at: 2013-12-29 14:22:11.826853)
.....Exception in thread APScheduler:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 811, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 764, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/site-packages/apscheduler/scheduler.py", line 581, in _main_loop
    next_wakeup_time = self._process_jobs(now)
  File "/usr/lib/python2.7/site-packages/apscheduler/scheduler.py", line 547, in _process_jobs
    self._threadpool.submit(self._run_job, job, run_times)
  File "/usr/lib/python2.7/site-packages/apscheduler/threadpool.py", line 102, in submit
    raise RuntimeError('Cannot schedule new tasks after shutdown')
RuntimeError: Cannot schedule new tasks after shutdown

................................................^C
stop scheduler ...
Kann mir jemand nen Tip geben??? Ich sehe den Wald vor lauter Bäumen nicht. Wenn alle Jobs beendet sind, beendet er sich ja selbst. Daher ist der Scheduler auch "down". Warum wird dann aber über die Zeilen:

Code: Alles auswählen

        if not self._is_running :
            self.start()
.....

def start(self):
        self._scheduler.start()
        self._is_running = True
Er nicht wieder gestartet???

Jemand nen Tip? Ich wäre dankbar.
BlackJack

@uwerothfeld: Ohne mich jetzt tatsächlich damit beschäftigt zu haben: Threads kann man zum Beispiel nur einmal laufen lassen. Wenn ein Thread-Objekt ein mal durchgelaufen ist, dann lässt es sich nicht erneut starten. Vielleicht ist das hier das gleiche Phänomen? Eventuell sogar weil Threads verwendet werden?
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

Hallo BlackJack,

aber darum sollte sich doch der APScheduler selber kümmern, welcher den ThreadPool intern verwaltet. Ist ja alles nicht von mir. :(

Wenn ich beim zweiten Durchlauf vorher draufschaue, ist die Job-Liste leer. Den start muß er eigentlich auch machen, da nur einem gestarteten Scheduler Jobs hinzugefügt werden können. :(

Komisches Ding.

Gruß

uwe
uwerothfeld
User
Beiträge: 17
Registriert: Freitag 24. Juni 2011, 14:18

Hallo zusammen,

also wenn ich die Schleife, welche die TestCases startet so abändere:

Code: Alles auswählen

for test_case in self._test_suite.test_cases:
    tscheduler = TestScheduler(self._config)
    tscheduler.create_schedule(test_case);
tuts. Also vermute ich mal in der Tat ein Fehler in der APScheduler library. Guten Rutsch. ;)
Antworten