这次我们主要讲解下Python自带模块当中的sched,不但小巧,也很强大,在实际应用中,某些场合还是可以用到的。作为一名Linux的SA,我们已经习惯了用crontab,而sched提供了一种延迟处理机制,也可以理解为任务调度的另一种方式的实现。

scheduler.enter(delay, priority, action, argument)

● delay:延迟时间

● priority:优先级(数越大,优先越低)

● action:回调函数

● argument:回调函数的参数

我们来写一个非常简单的例子:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sched

import time

scheduler = sched.scheduler(time.time, time.sleep)

def func(name):

print 'action: %s' % name , time.time()

print 'START:', time.time()

scheduler.enter(3, 2, func, ('fight',))

print 'Middle'

scheduler.enter(3, 1, func, ('make peace',))

scheduler.run()

print 'END:', time.time()

time.sleep(5)

运行结果如下:

START: 1453357480.74

Middle

action: make peace 1453357483.74

action: fight 1453357483.74

END: 1453357483.74

我们再举一个简单的例子说明下sched的其它特性:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sched

import time

scheduler = sched.scheduler(time.time, time.sleep)

def func(name):

print 'BEGIN: %s:' % name, time.time()

time.sleep(2)

print 'FINISH %s:' % name, time.time()

print 'START:', time.time()

scheduler.enter(2, 1, func, ('fight',))

scheduler.enter(3, 1, func, ('make peace',))

scheduler.run()

print 'END:', time.time()

time.sleep(20)

运行结果如下:

START: 1339665268.12BEGIN: fight: 1339665270.12FINISH fight: 1339665272.12BEGIN: make peace: 1339665272.12FINISH make peace: 1339665274.12END: 1339665274.12

我们仔细观察下两次任务调度的时间间隔,发现是同时运行的?那又是为什么呢?run()一直被阻塞,直到所有事件被全部执行完. 每个事件在同一线程中运行,所以如果一个事件的执行时间大于其他事件的延迟时间,那么,就会产生重叠。重叠的解决方法是推迟后来事件的执行时间。这样保证 没有丢失任何事件,但这些事件的调用时刻会比原先设定的迟。

上面的例子第二个事件在第一个事件运行结束后立即运行,因为第一个事件的执行时间足够长,已经超过第二个事件的预期开始时刻。(本来应该1339660903秒运行)

我们再介绍另外一个保证action在同一时刻执行的函数:

scheduler.enterabs(time, priority, action, argument)

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sched

import time

scheduler = sched.scheduler(time.time, time.sleep)

now = time.time()

def func(name):

print 'action:', time.time(), name

print 'START:', now

scheduler.enterabs(now + 2, 2, func, ('make peace',))

scheduler.enterabs(now + 2, 1, func, ('fight',))

scheduler.run()

print 'END:', now

time.sleep(20)

运行结果如下:

START: 1339666232.38

action: 1339666234.38 fight

action: 1339666234.38 make peace

END: 1339666232.38

因为优先级的关系,所以先fight,然后再make peace,打架是如此重要....总体来讲,如果想单纯的替换crontab的话,Scheduler框架更加适合,做延迟任务的调度处理的话sched还是可以考虑的。

如果我们想要取消任务调度,可以使用cancel()函数。在上面的例子中出现了阻塞延迟的现象,如果引用线程机制就会避免这种情况的发生,我们简单举个例子:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sched

import threading

import time

scheduler = sched.scheduler(time.time, time.sleep)

counter = 0

def increment_counter(name):

global counter

print 'action: %s' % name , time.time()

counter += 1

print 'counter: ', counter

print 'START:', time.time()

action1 = scheduler.enter(2, 1, increment_counter, ('action1',))

action2 = scheduler.enter(3, 1, increment_counter, ('action2',))

t = threading.Thread(target=scheduler.run)

t.start()

scheduler.cancel(action1)

t.join()

print 'counter:', counter

print 'END:', time.time()

time.sleep(20)

运行结果如下:

START: 1339666987.27

action: action2 1339666990.27

counter:  1

counter: 1

END: 1339666990.27

因为run()函数会引起阻塞,所以我们需要采用线程机制的方法在另一个线程中通过对象的引用取消任务调度,这里只调度了action2方法。

python使用sched模块周期性抓取网页内容

1.使用sched模块可以周期性地执行指定函数

2.在周期性执行指定函数中抓取指定网页,并解析出想要的网页内容,代码中是六维论坛的在线人数

论坛在线人数统计

#coding=utf-8

import time,sched,os,urllib2,re,string

#初始化sched模块的scheduler类

#第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。

s = sched.scheduler(time.time,time.sleep)

#被周期性调度触发的函数

def event_func():

req = urllib2.Request('http://bt.neu6.edu.cn/')

response = urllib2.urlopen(req)

rawdata = response.read()

response.close()

usernump = re.compile(r'总计 .*? 人在线')

usernummatch = usernump.findall(rawdata)

if usernummatch:

currentnum=usernummatch[0]

currentnum=currentnum[string.index(currentnum,'>')+1:string.rindex(currentnum,'

print "Current Time:",time.strftime('%Y,%m,%d,%H,%M',time.localtime(time.time())),'User num:',currentnum

# 保存结果,供图表工具amcharts使用

result=open('liuvUserNUm','a')

result.write('{year: new Date('+time.strftime('%Y,%m,%d,%H,%M',time.localtime(time.time()))+'),value:'+currentnum+'},\n')

result.close()

#enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,给他的参数(注意:一定要以tuple给如,如果只有一个参数就(xx,))

def perform(inc):

s.enter(inc,0,perform,(inc,))

event_func()

def mymain(inc=900):

s.enter(0,0,perform,(inc,))

s.run()

if __name__ == "__main__":

mymain()

本文出自别人博客,请务必保留此出处http://outofmemory.cn/code-snippet/3199/python-usage-sched-module-period-xing-zhuaqu-wangye-content

python任务调度框架_Python任务调度之sched相关推荐

  1. python任务调度框架_python任务调度框架apscheduler【转】

    简介 APScheduler(以下简称APS)框架可以让用户定时执行或者周期性执行Python任务.既可以添加任务也可以删除任务,还可以将任务存储在数据库中.当APS重启之后,还会继续执行之前设置的任 ...

  2. python任务调度框架_Python任务调度模块APScheduler

    一.APScheduler 是什么&APScheduler四种组成部分? APScheduler全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架 ...

  3. python定时任务框架_Python定时任务框架APScheduler

    APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...

  4. python gui框架_Python的GUI框架PySide的安装配置教程

    (一)说在前面 Python自带了GUI模块Tkinter,只是界面风格有些老旧.另外就是各种GUI框架了. 之前安装过WxPython,并做了简单的界面.遂最近又重新搜索了一下网上关于Python ...

  5. python基础框架_Python基础框架和工具-阿里云开发者社区

    Python基础框架和工具 最近在学Python金融大数据分析,在安装Python进行大数据分析的环境时遇到很多问题,例如:在安装pandas包时候就要到各种错误,总是缺少很多安装包,最后发现利用Py ...

  6. python企业级框架_Python六大开源框架对比:Web2py略胜一筹

    Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...

  7. python 爬虫框架_Python常用的几个高效率的爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.用这个框架可以轻松爬下来如亚马逊商品信息之类的数 ...

  8. python数据处理框架_python 最快 web 框架 Sanci 快速入门

    简介 Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快. 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求.这意味着你可以使用新的 a ...

  9. python企业级框架_Python六大开源框架对比:Web2py略胜一筹(转)

    Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...

最新文章

  1. 台大喊你来上课,深度学习优化,免费的哟
  2. 基于RT-Thread开发智能视觉组智能车-乐山师范学院
  3. 47. Permutations II 1
  4. 论文笔记:Distilling the Knowledge
  5. 台湾大学林轩田机器学习技法课程学习笔记3 -- Kernel Support Vector Machine
  6. 在Ubuntu 20.04 LTS中配置Java开发环境
  7. WebRTC 速成课程
  8. 在ASP.NET中利JavaScript实现控件的聚焦
  9. linux bitcoind环境搭建,bitcoin_book_2nd
  10. mysql 数据舍取_mysql取舍索引
  11. mysql中有exist吗_关于MySQL 中 EXISTS 的用法
  12. 写插件代码查看单据简单示例分享
  13. 禾川Q1系列PLC官方教程
  14. matlab生成vcf,从VCF文件中提取样本数据
  15. 笔记本电脑加装内存条和固态硬盘的前期准备工作
  16. IP2188-Datasheet
  17. 0x000000ED蓝屏完美解决方案
  18. html 调用idm,如何对IDM进行自定义设置
  19. 给学弟学妹们几点建议
  20. 2021年高处安装、维护、拆除多少钱及高处安装、维护、拆除模拟考试题

热门文章

  1. winhex 16.6
  2. 安卓下H5弹窗display:table的bug
  3. 获取网店管家订单信息
  4. wsl 模式 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  5. 《自动控制原理与设计(第5版)》读书笔记
  6. 普通二本,去过阿里外包,到现在年薪40W+的高级测试工程师,我的两年转行经历...
  7. 【Python表白小程序】“路过庄园,却只思念一朵玫瑰,我见过星河,但只爱一颗行星“
  8. 关关难过关关过——EPICS base 安装和利用makeBaseApp.pl建立一个IOC实例
  9. 乐1Pro 乐视X800+_官方线刷包_救砖包_解账户锁
  10. 三菱plc pwm指令_电厂技术 | 学习三菱PLC编程入门应先学习什么?想学习三菱PLC的朋友一定要看的入门第一课...