ucanuupnobb icon indicating copy to clipboard operation
ucanuupnobb copied to clipboard

【代码】重复执行某个任务,并实现一定程度的控制次数和随机

Open liujuanjuan1984 opened this issue 5 years ago • 0 comments

我在实战中经常遇到一个情况,即在很长的一段时间内,比如数日、数月地重复执行某个脚本,并非连续执行,每次执行有时间间隔。摸索实践下来,共有 3 种解决方案:

  1. 利用操作系统自带的“计划任务”
  2. 写一个自己调用自己的函数
  3. 利用第三方库:apscheduler

如何设定操作系统自带的“计划任务”,我已经写了一篇笔记:《windows 10 如何设定计划任务自动执行 python 脚本?》

该方式的好处是,自己不在电脑前,也可设定电脑自动开机执行指定任务。尤其是持续数月的某些脚本,譬如,我会每天抓取一次自己在csdn的文章浏览量数据,或每天分几个时段抓取一下知乎指定话题下有哪些热门问题。

不过即便掌握了设定计划任务这个技能,依然会用到第二个方法:


import your_model as yours
import time
import random


def repeat_myself(how_many_times = 10):
    print('--------',how_many_times,'----------')
    # 被封装的核心代码
    yours.one_def() 

    # 自循环减 1 ;如果剩余次数是0,则终止自循环
    how_many_times += -1
    if how_many_times == 0:
        print(datetime.datetime.now(),'stop it.')
        return

    # 每次调用设定一个时间间隔
    print(datetime.datetime.now(),'have a rest')
    how_long = random.randint(30,120)
    time.sleep(how_long)
    return repeat_myself(how_many_times)

# 该参数可视具体业务需要,自己设定。
repeat_myself(12)

先把核心的业务写在一个 your_model .py 文件里,然后新建一个this_sample.py文件来调用该业务。在设定计划任务时,直接把this_sample.py设为执行对象即可。这将让执行的频率、周期控制更加灵活。

如果是短期内重复,比如 48 H 内多次间隔执行,那么直接用上述自重复代码而不必用到计划任务了。

其实以上说辞,均无需记忆。当你有这个间歇重复执行的脚本时,知道有以上几种方式然后再具体掌握即可,现在只需知道有这样的线索。

liujuanjuan1984 avatar Sep 17 '19 12:09 liujuanjuan1984