Отменить таймер в Python - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над классом таймера в python и написал для него простой тестовый код.Моя цель состоит в том, чтобы напечатать сообщение «hello world» 10 раз, а затем отменить таймер после завершения итераций.Проблема в том, что я не могу отменить таймер, и кажется, что код печатает «привет мир» бесконечно.

Ниже мой код:

from threading import Timer

class myclass():
    iteration_count = 0
    heartbeat = 1

    def printMsg(self):
        print "hello world!"

    def start_job(self):

        self.printMsg()

        self.iteration_count = self.iteration_count + 1

        if self.iteration_count == 10:
            Timer(self.heartbeat, self.start_job, ()).cancel()

        Timer(self.heartbeat, self.start_job, ()).start()


m = myclass()
m.start_job()

Я использую Python 2.7 Любая помощь будетвысоко ценится

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Попробуйте:

from threading import Timer

class MyClass(object):
    def __init__(self):
        self.iteration_count = 0
        self.heartbeat = 1

    @staticmethod
    def print_msg():
        print "hello world!"

    def start_job(self):
        self.print_msg()
        self.iteration_count += 1

        timer = Timer(
            interval=self.heartbeat,
            function=self.start_job,
        )
        timer.start()

        if self.iteration_count >= 10:
            timer.cancel()

MyClass().start_job()

[ ПРИМЕЧАНИЕ ]:

Ваша проблема заключалась в том, что вы сделали еще один Timer() в if состоянии и.cancel() это.

0 голосов
/ 25 октября 2018

cancel метод используется для остановки созданного таймера до начала его действия, поэтому просто return будет в порядке.

if self.iteration_count == 10:
    return

См. Объекты таймера

Таймер можно остановить (до начала его действия), вызвав метод cancel ().

def hello(): 
    print "hello, world"

t = Timer(30.0, hello)
t.start() # will print "hello, world" after 30 seconds

t.cancel() # stop it printing "hello, world"
0 голосов
/ 25 октября 2018

Похоже, вы снова запускаете таймер сразу после его отмены.

Если вы измените свой код для возврата из start_job (), когда ваше конечное условие будет достигнуто, оно должно работать.

    if self.iteration_count == 10:
        Timer(self.heartbeat, self.start_job, ()).cancel()
        return

На самом деле вам даже не нужно отменять таймер таким образом, вы просто не начинаете новый, если условие достигнуто.

...