Sử dụng một sợi chứa một vòng lặp
from threading import Thread
import time
def background_task():
while not background_task.cancelled:
self.mqConn.heartbeat_tick()
time.sleep(30)
background_task.cancelled = False
t = Thread(target=background_task)
t.start()
background_task.cancelled = True
Ngoài ra, bạn có thể phân lớp hẹn giờ, để làm hủy dễ dàng:
from threading import Timer
class RepeatingTimer(Timer):
def run(self):
while not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.wait(self.interval)
t = RepeatingTimer(30.0, self.mqConn.heartbeat_tick)
t.start() # every 30 seconds, call heartbeat_tick
# later
t.cancel() # cancels execution
Nó có thể là quan trọng để đề cập đến rằng đây * sẽ không * thực hiện mỗi 30 giây nếu 'heartbeat_tick()' mất một số lượng đáng kể thời gian – goncalopp
Yep, điều này sẽ ít nhất 30 giây mỗi lần. Tối đa 30 giây là khó hơn một chút. – Eric
Nếu chức năng tiền cảnh của bạn bị ràng buộc CPU, liệu luồng nền sẽ được ngăn chặn từ khi GIL thực thi? –