我知道这是一个古老的 SO 问题,但我正在寻找一个简单的 SimPyTimer
类,就像@kxirog 的答案中提供的那个(这非常有用!),并解决了reset
@bbengfort 指出的问题。该reset
函数假定interrupt
立即执行,但这不是SimPy 文档中解释的情况:
process.interrupt() 实际做的是安排一个中断事件以立即执行。
所以调用self.start
实际在wait
进程被中断之前执行,这阻止了它启动一个新wait
进程。
以下是重置应该起作用的修改版本。
import simpy
class Timer(object):
def __init__(self, env, delay, callback):
self.env = env
self.delay = delay
self.action = None
self.callback = callback
def wait(self):
"""
Calls a callback after time has elapsed.
"""
try:
yield self.env.timeout(self.delay)
self.callback()
except simpy.Interrupt:
print("Interrupted!")
def running(self):
"""
Check if timer is running
"""
return self.action is not None and self.action.is_alive
def start(self):
"""
Starts the timer
"""
if not self.running():
self.action = self.env.process(self.wait())
def stop(self):
"""
Stops the timer
"""
if self.running():
self.action.interrupt()
self.action = None
def reset(self):
"""
Interrupts the current timer and restarts.
"""
self.stop()
self.start()