问题描述
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重置为“无”,否则您将处理旧数据,而这可能不是您想要的。