【问题标题】:python execute function every n seconds wait for completionpython每n秒执行一次函数等待完成
【发布时间】:2020-03-16 08:30:26
【问题描述】:

我想每隔 60 秒定期执行一次 FUNCTION,但如果之前的运行尚未完成,我不想再次执行 FUNCTION。如果上一次运行在例如完成120s 然后我想立即执行一个新的 FUNCTION 调用。如果之前的运行在例如完成10s 然后我想在执行新的 FUNCTION 调用之前等待 50s。

请看下面我的实现。

我可以通过例如实现它吗? subprocess.run 或一些时间循环库,以便实现更简洁?

import time


def hello(x):
    # some logic here
    # execution could take any time between e.g. <10s, 120s>


def main(ii):
    while True:
        start = int(time.time())

        try:
            val = next(ii)
        except StopIteration as ex:
            return None

        else:
            hello(val)

            run_time_diff = int(time.time()) - start

            if run_time_diff < 60:
                time.sleep(60 - run_time_diff)


ii = iter(list[[...],[...],...[...]])
main(ii=ii)

【问题讨论】:

  • 不需要低级的iter和next。只需使用一个普通的for 循环,它就更干净了。我认为您的运行时计算调度程序是可以的,除了时间戳的int() 引入了舍入错误。
  • 由于内存效率问题,我只想对迭代器进行操作。
  • 我看到了,但在那里我找不到处理漂移的解决方案。
  • @NullByte 只有在逐项生成列表时,才能使用迭代器节省内存。如果给定列表,则迭代器只是在原始列表之外存在的移动索引。

标签: python process execution schedule periodicity


【解决方案1】:

也许 apsheduler 可以帮助你。但是,如果您的工作运行时间超过等待时间,则可以跳过它。在这种情况下,您可以增加工人的数量。

import datetime
import time

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def some_job():
    time.sleep(5)
    print(f"{datetime.datetime.utcnow()}: Every 10 seconds")


job = scheduler.add_job(some_job, 'interval', seconds=10, max_instances=1)

scheduler.start()
try:
    while True:
        time.sleep(1)
finally:
    scheduler.shutdown()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多