如何暂停某个功能的一部分一段时间?
How can I pause part of a function for some period of time?
我有这样的代码:
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 模块,第一个功能没有问题。
schedule.every.hour.do(def1)
schedule.every.hour.do(def2)
...
但我希望 defN 从 url 收集数据(可能是因为它调用 def2 调用 def1),但与使用url 立即获取信息,我希望 defN 将 url 请求数据保存在变量中相同的固定时间段 X,然后继续执行其代码。
该函数的目的是每小时收集url前一小时的信息,然后在前一小时数据和当前小时数据之间进行运算。当然,在程序运行的第一个小时内,defN 不会 return 任何东西。有没有办法将函数的第一部分暂停一个小时,然后每小时安排一次?
我尝试在 defN 中使用 time.sleep() 但它也停止了其他功能两个小时。我学习了 Thread 模块,但我从来没有让它正常工作。我把这段代码放在除 defN:
以外的所有其他函数中
t = threading.Thread(target=defN)
t.start()
但是没有用。我该如何解决?
您可以通过多种方式实现这一目标。我将为您提供一种使用您的代码进行最少更改的方法,但这不是最佳方法,因为您没有要求更好或最佳方法。
首先,请注意,您已经使用该调度程序自然延迟了 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 否则您将处理旧数据,这可能不会随心所欲
我有这样的代码:
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 模块,第一个功能没有问题。
schedule.every.hour.do(def1)
schedule.every.hour.do(def2)
...
但我希望 defN 从 url 收集数据(可能是因为它调用 def2 调用 def1),但与使用url 立即获取信息,我希望 defN 将 url 请求数据保存在变量中相同的固定时间段 X,然后继续执行其代码。
该函数的目的是每小时收集url前一小时的信息,然后在前一小时数据和当前小时数据之间进行运算。当然,在程序运行的第一个小时内,defN 不会 return 任何东西。有没有办法将函数的第一部分暂停一个小时,然后每小时安排一次?
我尝试在 defN 中使用 time.sleep() 但它也停止了其他功能两个小时。我学习了 Thread 模块,但我从来没有让它正常工作。我把这段代码放在除 defN:
以外的所有其他函数中t = threading.Thread(target=defN)
t.start()
但是没有用。我该如何解决?
您可以通过多种方式实现这一目标。我将为您提供一种使用您的代码进行最少更改的方法,但这不是最佳方法,因为您没有要求更好或最佳方法。
首先,请注意,您已经使用该调度程序自然延迟了 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 否则您将处理旧数据,这可能不会随心所欲