我想每隔10秒调用一个函数(实际上,它是一个Web API)。但该函数可能需要随机t秒返回。 (假设t为0.1至1.0秒)
我们能想到的最简单的代码是
while True:
func() # take t sec
time.sleep(10) # sleep 10 sec
但在这种情况下,func
每隔(1 + t)秒调用一次。
有更好的方法吗?
我们应该使用一些多线程或类似的东西吗?具体的代码示例将不胜感激。谢谢。
答案 0 :(得分:1)
请记住下一次迭代应该发生的时间,大致相同(不完全正常工作的代码,我确定你可以从这里解决):
import time
nexttime = time.time()
while True:
func() # take t sec
nexttime += 10
sleeptime = nexttime - time.time()
if sleeptime > 0:
time.sleep(sleeptime)
答案 1 :(得分:1)
试试这个:
from multiprocessing import Pool
import time
pool = Pool(processes=1) # Start a worker processes.
while true:
result = pool.apply_async(func, [10], callback=finish) # Evaluate "func(10)" asynchronously calling callback when finished.
time.sleep(10)
这将每10秒调用一次您的功能。只要您确定返回的时间不会超过10秒,您就可以只使用一个工作进程。来自这里:Asynchronous method call in Python?
答案 2 :(得分:1)
我找到了另一种使用sched
模块的方法。
import time
import sched
def daemon(local_handler, t):
print('time {}'.format(t))
# call func here
# time.sleep(2)
local_handler.enterabs(t + 10, 1, daemon, (local_handler, t+10))
handler = sched.scheduler(time.time, time.sleep)
t = time.time()
handler.enter(0, 1, daemon, (handler, t))
handler.run()
这种方法的一个好处是我们可以准确地控制函数的时间。例如,我们可以在时钟为0.31,10.31,20.31,30.31,...
时调用该函数答案 3 :(得分:0)
您可以使用以下内容:
import time
start=time.perf_counter()
call_new_func()
while ((time.perf_counter()-start)<desired_time_wait):
pass #busy-wait
在while True
圈内。