gpt4 book ai didi

python - 在Python中连接定时器

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:04 25 4
gpt4 key购买 nike

我有这个辅助计时器类:

class RepeatingTimer(object):
def __init__(self, interval, f, *args, **kwargs):
self.args = args
self.interval = interval
self.f = f
self.kwargs = kwargs
self.timer = None

def callback(self):
# The order is so self.f will be able to cancel the timer
self.start()
self.f(*self.args, **self.kwargs)

def cancel(self, timer_id):
self.timer.cancel()
del timers[timer_id]

def start(self):
self.timer = Timer(self.interval, self.callback)
self.timer.start()

我想要的是能够执行计时器,例如:

timers = {}
def execute_func(*args, **kwargs):
print("hi")
timer_id = random.random()
timers[timer_id] = RepeatingTimer(1, execute_func)
timers[timer_id].start()

我需要 execute_func 中的代码能够停止计时器,问题是我想连接这些计时器的执行,例如:

我执行第一个计时器(那3行),计时器执行的每一秒我都会运行一些代码,在指定的秒我手动结束计时器并想要执行另一个计时器(那3行)。

换句话说,当第一个计时器完成(手动,通过一些回调)时,我想启动一个新的计时器,我已经成功地通过丑陋的回调层次结构方式实现了这一点,例如:

main_cb("b1",
lambda timer_id: main_cb("b2",
lambda timer_id: main_cb("b3")))

问题是我无法迭代["b1", "b2", "b3"]我必须手动进行丑陋的嵌套。

结论:我正在寻找一种方法,使用某些参数执行相同函数的通用方法,其中一个参数应该是一个 done 回调,当调用它将启动下一个迭代器,依此类推。

最佳答案

您绝对可以迭代该列表以生成嵌套回调:

from functools import partial

def main_cb(arg, next_cb=None):
print(arg)
if next_cb:
next_cb()

callback = None
for b in reversed(['b1', 'b2', 'b3']):
callback = partial(main_cb, b, callback) # (lambda creates a late binding closure bug)

print(callback)
callback()

输出:

functools.partial(<function main_cb at 0x1007c0f28>, 'b1', functools.partial(<function main_cb at 0x1007c0f28>, 'b2', functools.partial(<function main_cb at 0x1007c0f28>, 'b3', None)))
b1
b2
b3

关于python - 在Python中连接定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com