Python threading - How to repeatedly execute a fun

2019-08-16 23:54发布

问题:

I have this code:

import threading
def printit():
  print ("Hello, World!")
  threading.Timer(1.0, printit).start()
threading.Timer(1.0, printit).start()

I am trying to have "Hello, World!" printed every second, however when I run the code nothing happens, the process is just kept alive.

I have read posts where exactly this code worked for people.

I am very confused by how hard it is to set a proper interval in python, since I'm used to JavaScript. I feel like I'm missing something.

Help is appreciated.

回答1:

I don't see any issue with your current approach. It is working for me me in both Python 2.7 and 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()

which prints:

Hello, World!
Hello, World!

But I'll suggest to start the thread as:

thread = threading.Timer(1.0, printit)
thread.start()

So that you can stop the thread using:

thread.cancel()

Without having the object to Timer class, you will have to shut your interpreter in order to stop the thread.


Alternate Approach:

Personally I prefer to write a timer thread by extending Thread class as:

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..")

Then start thread with object of Event class as:

my_event = Event()
thread = MyThread(my_event)
thread.start()

You'll start seeing the below output in the screen:

Thread is running..
Thread is running..
Thread is running..
Thread is running..

To stop the thread, execute:

my_event.set()

This provides more flexibility in modifying the changes for the future.



回答2:

I run it in python 3.6.It works ok as you expected .



回答3:

Try this:

import time

def display():
    for i in range(1,5):
        time.sleep(1)
        print("hello world")


回答4:

I have used Python 3.6.0.
And I have used _thread and time package.

import time
import _thread as t
def a(nothing=0):
    print('hi',nothing)
    time.sleep(1)
    t.start_new_thread(a,(nothing+1,))
t.start_new_thread(a,(1,))#first argument function name and second argument is tuple as a parameterlist.

o/p will be like
hi 1
hi 2
hi 3
....



回答5:

What might be an issue is that you are creating a new thread each time you are running printit.

A better way may be just to create one thread that does whatever you want it to do and then you send and event to stop it when it is finished for some reason:

from threading import Thread,Event
from time import sleep

def threaded_function(evt):
    while True: # ie runs forever
        if evt.isSet():
            return()
        print "running"
        sleep(1)


if __name__ == "__main__":
    e=Event()
    thread = Thread(target = threaded_function, args = (e, ))
    thread.start()
    sleep(5)
    e.set() # tells the thread to exit
    thread.join()
    print "thread finished...exiting"