每x秒调用一次函数(Python)

时间:2017-05-28 02:13:46

标签: python api loops time

我想每隔10秒调用一个函数(实际上,它是一个Web API)。但该函数可能需要随机t秒返回。 (假设t为0.1至1.0秒)

我们能想到的最简单的代码是

while True:
    func()          # take t sec
    time.sleep(10)  # sleep 10 sec

但在这种情况下,func每隔(1 + t)秒调用一次。 有更好的方法吗?

我们应该使用一些多线程或类似的东西吗?具体的代码示例将不胜感激。谢谢。

4 个答案:

答案 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,...

时调用该函数

此代码取自Python Scheduler vs loop + sleep

答案 3 :(得分:0)

您可以使用以下内容:

import time
start=time.perf_counter()
call_new_func()
while ((time.perf_counter()-start)<desired_time_wait):
    pass #busy-wait

while True圈内。