我有一系列事件和他们的投票时间。 [{ “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}])
答案 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处同步,并在正确的位置重新开始。
这有一个小问题,即如果任何功能需要很长时间才能执行,我们的内部时钟将开始漂移。如果你需要在第二天绝对运行所有内容,那么你需要做一些更复杂的事情,以确保你等待适当的时间。