Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Threading.Timer(5, function) launch every 5 second

I'm having a hard hard time with Timer function from threading.

Basically, when my program starts, I want to log stats every x second.

So I thought I could do it with the Timer function (launch function every 5 second).

For now, I did :

from threading import Timer
def startLogger():
    while True:
        t = Timer(5, function)
        t.start()


def function():
    print("hey")

But it launch error, so I think it's not the good way to do it.

RuntimeError: can't start new thread

If someone can give me a clue, it would be appreciated!

like image 260
Francis Robitaille Avatar asked Dec 04 '22 21:12

Francis Robitaille


2 Answers

Instead of starting a new thread every five seconds, you can create just one thread and run all your code from there.

from time import sleep
from threading import Thread

def startLogger():
    while True:
        function()
        sleep(5)

def function():
    print("hey")

Thread(target=startLogger).start()

startLogger will continually run. It'll call function, then pause for 5 seconds, then start again, calling function and so on.

It goes in its own thread so that the sleep(5) doesn't also stop your main thread for 5 seconds.

like image 187
ChristianFigueroa Avatar answered Dec 06 '22 10:12

ChristianFigueroa


You can try the following. The idea is, that you are scheduling the next function call just at the end of this function's body:

import threading

def mylog():
  print "hey"
` threading.Timer(5.0, mylog)`.start()

mylog()
like image 36
pkacprzak Avatar answered Dec 06 '22 09:12

pkacprzak