首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python计时器线程关闭

python计时器线程关闭
EN

Stack Overflow用户
提问于 2015-07-16 20:50:31
回答 2查看 1.4K关注 0票数 0

我正在尝试创建一个计时器工作线程,它可以在任何时候退出。python有一个内置计时器,它的回调函数只调用一次?!我不知道为什么叫计时器。

然后我就得在工作线程里睡一觉,这是个坏主意。timerThread.cancel()不能关闭工作线程。如果我使用事件退出工作线程,则工作线程只有在醒来后才能退出。

我期待一个定时器工作线程,它可以在任何时候退出。我不想让工作线被阻塞。

有什么办法可以实现吗?

代码语言:javascript
代码运行次数:0
运行
复制
def Show():
    while 1:
        time.sleep(10)
        print("Nice!")

if __name__ == '__main__':

    timerThread = threading.Timer(1,Show)
    timerThread.start()
    while 1:
        input = str(sys.stdin.readline())
        if input == 'EXIT\n':
            timerThread.cancel()
            break;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-16 21:05:20

就您的观点而言,python中的Timer对象1只运行一次,一段时间后执行一个函数。不过,该函数可以启动一个新的Timer对象。下面是这个实现的一个例子。

代码语言:javascript
代码运行次数:0
运行
复制
timerThread = None

def timesUp():
    global timerThread
    print('Nice!')
    timerThread = Timer(10, timesUp)
    timerThread.start()

def main():
    global timerThread
    timerThread = Timer(10, timesUp)
    timerThread.start()
    while 1:
        input = str(sys.stdin.readline())
        if input == 'EXIT\n':
            timerThread.cancel()
            break;

总的来说,由于python中的GIL 2问题,您将遇到线程正确处理的问题,因为一次只有一个线程可以访问解释器。这就是为什么python中的很多框架都是单线程的异步框架(例如gevent 3,Tor非议4)。它们没有使用线程,而是侦听IOLoop (eventlets,epoll),并协作地将操作流生成给其他等待的协同器。

1- https://docs.python.org/2/library/threading.html#timer-objects

2- https://wiki.python.org/moin/GlobalInterpreterLock

3- http://www.gevent.org/

4- http://www.tornadoweb.org/en/stable/

票数 0
EN

Stack Overflow用户

发布于 2016-05-11 13:37:33

你可以用这个类来解决你的问题。

代码语言:javascript
代码运行次数:0
运行
复制
import time
from threading import Thread

class Timer(Thread):
    def __init__(self, seconds, callback, *args, **kwargs):
        Thread.__init__(self)

        assert callable(callback)
        self.__callback = callback
        self.__seconds = seconds
        self.__args = args
        self.__kwargs = kwargs

        self.running = False

    def run(self):
        self.running = True
        while self.running:
            Thread(target=self.__callback, args=self.__args, kwargs=self.__kwargs).start()
            time.sleep(self.__seconds)

    def stop(self):  
        self.running = False

若要调用此函数,请使用

代码语言:javascript
代码运行次数:0
运行
复制
def Test(spam,eggs=10):
     print spam, eggs

timerFunction = Timer(1,Test,10,eggs=99) # The number 1 is the time in seconds
timerFunction.start()

若要停止执行,请使用:

代码语言:javascript
代码运行次数:0
运行
复制
timerFunction.stop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31464270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档