在一个线程中每n秒调度一次事件(python)

时间:2018-05-18 12:06:26

标签: python algorithm timer scheduling

我有一系列事件和他们的投票时间。 [{ “A”:5, “B”:7, “C”:9}]

所以事件A(某个函数)需要每x秒调用一次, 在上面的示例中,函数需要从现在开始每隔5秒调用一次(不只是一次,而是继续重复)

和B函数需要从现在开始每隔7秒调用一次,依此类推。

在第35秒时,将调用A和B两者(考虑到函数A和B几乎立即返回假设printf())

这是否有标准算法?如果没有关于如何实现这一点的任何指针?

这一行,(虽然不起作用)

import threading
class A():
    def A():
        printf "A"
    def B():
        printf "B"
    def __init__(self, *args, **kwargs):
        self.iteration = 1
    def execute(self,arr):
        for key in arr[0]:
            print key, arr[key]
            t1 = threading.Timer(arr[key], key).start()
            t2 = threading.Timer(arr[key], key).start()


A().execute([{"A":5,"B",7}])

2 个答案:

答案 0 :(得分:0)

首先,您应该将计时器列表转换为字典,其中函数为键,间隔为值。然后你可以集成一个计数器,计算每次睡眠(1)呼叫后的秒数。或者,您可以使用datetime模块查找现在和启动时间之间的时间差。

import time    
def a():
    pass
def b():
    pass
timers = {a:9, b:3}
time_counter = 0
while True:
    time.sleep(1)
    time_counter += 1
    for function in timer.keys():
        if time_counter % timer[function] is 0:
            function()

显然,你必须改变我写的代码,但原则应该是类似的

答案 1 :(得分:0)

我的版本与El Shotz'基本相同,但我阻止计数器变得非常大(最终表现为内存泄漏,如果不是精度错误),如下所示:

numerator

counter是所有等待值的乘积,因此当<!doctype html> <html> <head> <title>Cube and square</title> </head> <body> <table border=1> <tr> <th>Cube</th> <th>Square root</th> </tr> <?php //Cube ans square for ($i = 1; $i <= 10; $i++) { echo "<tr>"; echo "<td>" . $i . "^3 = " . pow($i, 3) . "</td>"; echo "<td> √" . $i . " = " . sqrt($i) . "</td>"; echo "</tr>"; } ?> </table> </body> </html> 循环结束时,我们将在0处同步,并在正确的位置重新开始。

这有一个小问题,即如果任何功能需要很长时间才能执行,我们的内部时钟将开始漂移。如果你需要在第二天绝对运行所有内容,那么你需要做一些更复杂的事情,以确保你等待适当的时间。