Python 线程 - 如何在单独的线程中重复执行一个函数?

Jon*_*ner 3 python multithreading timer setinterval

我有这个代码:

import threading
def printit():
  print ("Hello, World!")
  threading.Timer(1.0, printit).start()
threading.Timer(1.0, printit).start()
Run Code Online (Sandbox Code Playgroud)

我正在尝试说“你好,世界!” 每秒打印一次,但是当我运行代码时没有任何反应,该过程只是保持活动状态。

我读过一些帖子,其中这段代码确实对人们有用。

我对在 python 中设置适当的间隔有多困难感到非常困惑,因为我习惯了 JavaScript。我觉得我失去了一些东西。

感谢帮助。

Moi*_*dri 5

我认为您当前的方法没有任何问题。它在 Python 2.7 和 3.4.5 中都对我有用。

import threading

def printit():
    print ("Hello, World!")
    # threading.Timer(1.0, printit).start()
    #  ^ why you need this? However it works with it too

threading.Timer(1.0, printit).start()
Run Code Online (Sandbox Code Playgroud)

打印:

Hello, World!
Hello, World!
Run Code Online (Sandbox Code Playgroud)

但我建议将线程启动为:

thread = threading.Timer(1.0, printit)
thread.start()
Run Code Online (Sandbox Code Playgroud)

这样您就可以使用以下命令停止线程:

thread.cancel()
Run Code Online (Sandbox Code Playgroud)

如果没有对象进行Timer类,您将必须关闭解释器才能停止线程。


替代方法:

Thread就我个人而言,我更喜欢通过扩展类来编写计时器线程:

from threading import Thread, Event

class MyThread(Thread):
    def __init__(self, event):
        Thread.__init__(self)
        self.stopped = event

    def run(self):
        while not self.stopped.wait(0.5):
            print("Thread is running..")
Run Code Online (Sandbox Code Playgroud)

然后使用类对象启动线程,Event如下所示:

my_event = Event()
thread = MyThread(my_event)
thread.start()
Run Code Online (Sandbox Code Playgroud)

您将开始在屏幕上看到以下输出:

Thread is running..
Thread is running..
Thread is running..
Thread is running..
Run Code Online (Sandbox Code Playgroud)

要停止线程,请执行:

my_event.set()
Run Code Online (Sandbox Code Playgroud)

这为将来修改更改提供了更大的灵活性。