关于php:怎么把Python当偷懒神器用

32次阅读

共计 2459 个字符,预计需要花费 7 分钟才能阅读完成。

在日常工作中,咱们经常会用到须要周期性执行的工作,一种形式是采纳 Linux 零碎自带的 crond[1] 联合命令行实现。另外一种形式是间接应用 Python。接下里整顿的是常见的 Python 定时工作的实现形式。

1、利用 while True: + sleep() 实现定时工作

位于 time 模块中的 sleep(secs) 函数,能够实现令以后执行的线程暂停 secs 秒后再继续执行。所谓暂停,即令以后线程进入阻塞状态,当达到 sleep() 函数规定的工夫后,再由阻塞状态转为就绪状态,期待 CPU 调度。

基于这样的个性咱们能够通过 while 死循环 +sleep() 的形式实现简略的定时工作。

代码示例:

import datetime

import time

def time_printer():

    now = datetime.datetime.now()

    ts = now.strftime('%Y-%m-%d %H:%M:%S')

    print('do func time :', ts)

def loop_monitor():

    while True:

        time_printer()

        time.sleep(5)  # 暂停 5 秒

if __name__ == "__main__":

    loop_monitor()

次要毛病:

  • 只能设定距离,不能指定具体的工夫,比方每天早上 8:00
  • sleep 是一个阻塞函数,也就是说 sleep 这一段时间,程序什么也不能操作。

2、应用 Timeloop 库运行定时工作

Timeloop[2] 是一个库,可用于运行多周期工作。这是一个简略的库,它应用 decorator 模式在线程中运行标记函数。

示例代码:

import time

from timeloop import Timeloop

from datetime import timedelta

tl = Timeloop()

@tl.job(interval=timedelta(seconds=2))

def sample_job_every_2s():

    print "2s job current time : {}".format(time.ctime())

@tl.job(interval=timedelta(seconds=5))

def sample_job_every_5s():

    print "5s job current time : {}".format(time.ctime())

@tl.job(interval=timedelta(seconds=10))

def sample_job_every_10s():

    print "10s job current time : {}".format(time.ctime())

3、利用 threading.Timer 实现定时工作

threading 模块中的 Timer 是一个非阻塞函数,比 sleep 稍好一点,timer 最根本了解就是定时器,咱们能够启动多个定时工作,这些定时器工作是异步执行,所以不存在期待程序执行问题。

Timer(interval, function, args=[], kwargs={})

  • interval: 指定的工夫
  • function: 要执行的办法
  • args/kwargs: 办法的参数

代码示例:

import datetime

from threading import Timer

def time_printer():

    now = datetime.datetime.now()

    ts = now.strftime('%Y-%m-%d %H:%M:%S')

    print('do func time :', ts)

    loop_monitor()

def loop_monitor():

    t = Timer(5, time_printer)

    t.start()

if __name__ == "__main__":

    loop_monitor()

备注:Timer 只能执行一次,这里须要循环调用,否则只能执行一次

4、利用内置模块 sched 实现定时工作

sched 模块实现了一个通用事件调度器,在调度器类应用一个提早函数期待特定的工夫,执行工作。同时反对多线程应用程序,在每个工作执行后会立即调用延时函数,以确保其余线程也能执行。

class sched.scheduler(timefunc, delayfunc) 这个类定义了调度事件的通用接口,它须要内部传入两个参数,timefunc 是一个没有参数的返回工夫类型数字的函数(罕用应用的如 time 模块外面的 time),delayfunc 应该是一个须要一个参数来调用、与 timefunc 的输入兼容、并且作用为提早多个工夫单位的函数(罕用的如 time 模块的 sleep)。

代码示例:

import datetime

import time

import sched

def time_printer():

    now = datetime.datetime.now()

    ts = now.strftime('%Y-%m-%d %H:%M:%S')

    print('do func time :', ts)

    loop_monitor()

def loop_monitor():

    s = sched.scheduler(time.time, time.sleep)  # 生成调度器

    s.enter(5, 1, time_printer, ())

    s.run()

if __name__ == "__main__":

    loop_monitor()

scheduler 对象次要办法:

  • enter(delay, priority, action, argument),安顿一个事件来提早 delay 个工夫单位。
  • cancel(event):从队列中删除事件。如果事件不是以后队列中的事件,则该办法将跑出一个 ValueError。
  • run():运行所有预约的事件。这个函数将期待(应用传递给构造函数的 delayfunc() 函数),而后执行事件,直到不再有预约的事件。

集体点评:比 threading.Timer 更好,不须要循环调用。

Python 是一种十分多样化且倒退良好的语言,因而必定会有许多我没有思考到的性能,如果大家有晓得的,能够在评论区通知我,看到这里,麻烦点个赞再走吧~ 感激浏览。

正文完
 0