【问题标题】:How can I pause part of a function for some period of time?如何暂停部分功能一段时间?
【发布时间】:2020-09-19 10:29:29
【问题描述】:

我有这样的代码:

def1():
    a = requests.get(url)
    ...

def2():
    something that calls def1()

def3():
    something that calls def2()

def4():
    something that calls def2()

defN():
    something that calls def(2)

我想安排所有这些函数每隔固定时间 X 执行一次。为此,我使用了调度模块,第一个函数没有问题。

schedule.every.hour.do(def1)
schedule.every.hour.do(def2)
...

但我希望 defN 从 url 收集数据(可能是因为它调用 def2 调用 def1),但与其他立即使用 url 信息的函数不同,我希望 defN 持有url 请求一个变量中相同的固定时间段 X 的数据,然后继续执行它的代码。

该功能的目的是每小时收集上一小时的url信息,然后对上一小时数据和当前小时数据进行运算。当然,在程序运行的第一个小时内,defN 不会返回任何内容。有没有办法将函数的第一部分暂停一小时,然后每小时安排一次?

我尝试在 defN 中使用 time.sleep() 但它也停止了其他功能两个小时。我学习了 Thread 模块,但我从来没有让它正常工作。我把这段代码放在除 defN 之外的所有其他函数中:

t = threading.Thread(target=defN)
t.start()

但它没有用。我该如何解决这个问题?

【问题讨论】:

    标签: python-3.x function datetime time python-multithreading


    【解决方案1】:

    有几种方法可以实现这一目标。我将为您提供一种对您的代码进行少量更改的方式,但这不是最佳方式,因为您没有要求更好或最佳的方式。

    首先,请注意,您使用该调度程序已经有 1 小时的自然延迟。因此,defN 不需要休眠或等待或阻塞。

    您可以定义一个全局变量 defN_prev_data。最初将 None 分配给它。那么你的 defN 函数可以如下所示:

    # create global var and unit to None
    defN_prev_data = None
    
    def defN()
        # specify global here because this function will modify it
        global defN_prev_data
        new_data = something that calls def2()
        if defN_prev_data is not None:
            process defN_prev_data
        defN_prev_data = new_data
    
    
    Schedule defN()
    

    只需确保全局变量在您的脚本或模块中声明并在 defN 被调度或调用之前初始化为 None。

    此外,如果您曾经在相同的进程上下文中停止和重新启动计划任务,则需要将 defN_prev_data 重置为 None,否则您将处理旧数据,这可能不是您想要的。

    【讨论】:

    • 非常感谢,我明白我在想什么了!什么是更好/最佳的方法?如果你有时间我也想知道,我刚刚开始学习 Python
    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多