如何在一段时间内暂停部分功能?

问题描述

我有这样的代码

function set_post_content( $entry,$form ) {

//getting post
$post = get_post( $entry['post_id'] );

//changing post content
$post->post_content = 'Blender Version:' . rgar( $entry,'7' ) . "<br/> <img src='" . rgar( $entry,'8' ) . "'> <br/> <br/> " . rgar( $entry,'13' ) . " <br/> <img src='" . rgar( $entry,'5' ) . "'>";

//updating post
$updated_post = wp_update_post( $post,true );

if (is_wp_error($updated_post )) {
    $errors = $updated_post->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
  }
}

我想安排所有这些功能每隔固定的时间X执行一次。为此,我使用了schedule模块,而第一个功能没有问题。

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)

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

功能的目的是每小时收集前一小时的url信息,然后在前一小时数据和当前小时数据之间进行操作。当然,在程序运行的第一个小时,defN不会返回任何内容。是否可以将函数的第一部分暂停一个小时,然后每小时进行调度?

我试图在defN中使用time.sleep(),但是它也停止了其他功能两个小时。我了解了线程模块,但从未使其正常工作。我将此代码放入除defN之外的所有其他函数中:

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

但是没有用。我该如何解决

解决方法

有几种方法可以实现此目标。我将为您提供一种只需很少的更改即可使用代码的方法,但这并不是最佳方法,因为您并没有要求更好或最佳的方法。

首先,请注意,使用该调度程序已经自然延迟了1个小时。因此,defN不需要睡眠,等待或阻止。

您可以定义全局变量defN_prev_data。最初为其分配无。然后您的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重置为“无”,否则您将处理旧数据,而这可能不是您想要的。