写一个多线程安全定时器示例,注意避免抢占资源和死锁
时间: 2024-03-03 20:46:59 浏览: 117
好的,下面是一个多线程安全定时器的示例代码:
```python
import threading
import time
class Timer:
def __init__(self, timeout, callback):
self.timeout = timeout
self.callback = callback
self.timer_thread = threading.Thread(target=self.run)
self.timer_thread.daemon = True
self.timeout_lock = threading.Lock()
self.timeout_event = threading.Event()
def start(self):
self.timer_thread.start()
def run(self):
while not self.timeout_event.wait(self.timeout):
with self.timeout_lock:
if self.callback:
self.callback()
def cancel(self):
with self.timeout_lock:
self.callback = None
self.timeout_event.set()
```
这个定时器使用了一个线程来实现定时功能,并且使用了锁来避免资源抢占和死锁。具体来说,这个定时器有以下几个特点:
1. 初始化时,需要传入一个超时时间和一个回调函数。超时时间表示定时器的间隔时间,回调函数表示定时器触发时需要执行的操作。
2. 定时器使用一个线程来实现定时功能,并且这个线程是一个守护线程,当主线程退出时,它会自动退出。
3. 定时器使用了一个锁来保证回调函数的安全性。具体来说,在定时器触发时,会先获取锁,然后再执行回调函数。这样可以避免多个线程同时执行回调函数,导致资源抢占和死锁。
4. 定时器使用了一个事件来控制定时器的启动和停止。当定时器启动时,事件会被清除,当定时器停止时,事件会被设置。
5. 定时器提供了一个取消方法,可以在定时器启动后随时取消定时器。具体来说,取消定时器会先获取锁,然后把回调函数设置为 None,最后设置事件,这样可以保证定时器的安全性。
下面是一个使用示例:
```python
def hello():
print("Hello, world!")
timer = Timer(1, hello)
timer.start()
time.sleep(5)
timer.cancel()
```
这个示例中,定时器每隔 1 秒会执行一次 hello 函数,然后程序会等待 5 秒钟后,再取消定时器。在定时器被取消后,程序会退出。
阅读全文