重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
使用关键词 def 声明这是一个函数
创新互联公司是一家专注于网站建设、做网站与策划设计,琼中黎族网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:琼中黎族等地区。琼中黎族做网站价格咨询:13518219792
1def 函数名 (参数):
2 语句块
参数可以没有,也可以有多个,用逗号隔开,第一行称为函数头,结尾一定要加冒号,代表开始进入函数体的执行。
语句块也就是函数体,是关于这个函数要实现的功能的语句,语句要有返回值即return语句,如果没有return语句,就代表return none.
在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回
def 函数名([参数1,参数2,...,参数n]):
函数体
函数代码以def关键词开头,后接函数标识符名称和圆括号():
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
函数的第一行语句可以选择性的使用文档字符串-用于存放函数说明
函数内容以冒号起始,并且缩进
return[表达式]结束函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None
如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点:
1.不方便执行 秒级的任务 。
2.当需要执行的定时任务有上百个的时候,Crontab的 管理就会特别不方便 。
另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。
在你想要使用一个轻量级的任务调度工具,而且希望它尽量简单、容易使用、不需要外部依赖,最好能够容纳 Crontab 的所有基本功能,那么 Schedule 模块是你的不二之选。
使用它来调度任务可能只需要几行代码,感受一下:
上面的代码表示每10分钟执行一次 job 函数,非常简单方便。你只需要引入 schedule 模块,通过调用 scedule.every(时间数).时间类型.do(job) 发布周期任务。
发布后的周期任务需要用 run_pending 函数来检测是否执行,因此需要一个 While 循环不断地轮询这个函数。
下面具体讲讲Schedule模块的安装和初级、进阶使用方法。
1.准备
请选择以下任一种方式输入命令安装依赖 :
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
2.基本使用
最基本的使用在文首已经提到过,下面给大家展示更多的调度任务例子:
可以看到,从月到秒的配置,上面的例子都覆盖到了。不过 如果你想只运行一次任务 的话,可以这么配:
参数传递
如果你有参数需要传递给作业去执行,你只需要这么做:
获取目前所有的作业
如果你想获取目前所有的作业:
取消所有作业
如果某些机制触发了,你需要立即清除当前程序的所有作业:
标签功能
在设置作业的时候,为了后续方便管理作业,你可以给作业打个标签,这样你可以通过标签过滤获取作业或取消作业。
设定作业截止时间
如果你需要让某个作业到某个时间截止,你可以通过这个方法:
截止日期之后,该作业将无法运行。
立即运行所有作业,而不管其安排如何
如果某个机制触发了,你需要立即运行所有作业,可以调用 schedule.run_all :
3.高级使用
装饰器安排作业
如果你觉得设定作业这种形式太啰嗦了,也可以使用装饰器模式:
并行执行
默认情况下,Schedule 按顺序执行所有作业。其背后的原因是,很难找到让每个人都高兴的并行执行模型。
不过你可以通过多线程的形式来运行每个作业以解决此限制:
日志记录
Schedule 模块同时也支持 logging 日志记录,这么使用:
效果如下:
异常处理
Schedule 不会自动捕捉异常,它遇到异常会直接抛出,这会导致一个严重的问题: 后续所有的作业都会被中断执行 ,因此我们需要捕捉到这些异常。
你可以手动捕捉,但是某些你预料不到的情况需要程序进行自动捕获,加一个装饰器就能做到了:
这样, bad_task 在执行时遇到的任何错误,都会被 catch_exceptions 捕获,这点在保证调度任务正常运转的时候非常关键。
1.计算生日是星期几
当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~
比如girl friend 的生日假设是 gf_birthday='2017-3-3'
1).我们先把变量格式化成一个datetime对象
birthday=datetime.datetime.strptime(gf_birthday,'%Y-%m-%d')
2).然后利用datetime里面的函数weekday来得到一个下标
birthday.weekday()
3).构造一个weekdays的列表,根据下标从列表里面取出是周几
weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
weekdays[birthday.weekday()]
当然你要计算比如情人节,圣诞节什么的都可以用上面的程序,或者整个列表把10年的节日都罗列计算一下都是可以了,是不是很简单,对日期的理解有木有加深了一下下
2.定时任务
在Python里面,比如你想定期去爬一个网页,或者做运维的同学想每天12点去定时download一个文件,或者定时去扫描一些服务器,甚至老板的需求不停的变可能是,每隔5分钟,或者每小时的整点10分,每周每月都有一些定时任务
用Python怎么破很简单,下面这个程序轻松搞定
我们先从一个最简单的例子说,假设我们是每分种的第10秒,去执行一个任务去打印一下当前的目录
1).window下是dir命令,linux是ls
我们用platform这个模块来判断一下操作系统
import platform
os_platfrom=platform.platform()
if os_platfrom.startswith('Darwin'):
print'this is mac os system'
os.system('ls')
elif os_platfrom.startswith('Window'):
print'this is win system'
os.system('dir')
2).如何定时执行
a.我们先获取当前的时间
now=datetime.datetime.now()
假设当前时间是2017-02-09 20:19:47.555000
b.然后我们输入一个你要定时执行的target时间
比如你是x分10秒的时候执行sched_Timer=datetime.datetime(x,x,x,x,x,10)
前面的x是并不重要(只要最后是10秒就行了),我们就把目标时间设的比当前晚一点即可:
sched_Timer=datetime.datetime(2017,2,9,20,20,10)
c.好当时间到了20:20:10的时候要运行我们的程序
如何定时到了呢,很简单用
if now==sched_Timer:
'run Task'
d.那么如何让时间在下一分钟10秒继续执行呢,也很简单用timedelta()
datetime.timedelta(minutes=1)把target时间往后增加一分钟
sched_Timer=sched_Timer+datetime.timedelta(minutes=1)
然后外边用个while 死循环hold住就可以了
同样的这个代码也可以扩展,把minutes=1改成hours=1就变成了每个小时定时任务,改成days=1就变成每天的定时任务
asyncio是官方提供的协程的类库,从python3.4开始支持该模块
async awiat是python3.5中引入的关键字,使用async关键字可以将一个函数定义为协程函数,使用awiat关键字可以在遇到IO的时候挂起当前协程(也就是任务),去执行其他协程。
await + 可等待的对象(协程对象、Future对象、Task对象 - IO等待)
注意:在python3.4中是通过asyncio装饰器定义协程,在python3.8中已经移除了asyncio装饰器。
事件循环,可以把他当做是一个while循环,这个while循环在周期性的运行并执行一些协程(任务),在特定条件下终止循环。
loop = asyncio.get_event_loop():生成一个事件循环
loop.run_until_complete(任务):将任务放到事件循环
Tasks用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。除了使用 asyncio.create_task() 函数以外,还可以用低层级的 loop.create_task() 或 ensure_future() 函数。不建议手动实例化 Task 对象。
本质上是将协程对象封装成task对象,并将协程立即加入事件循环,同时追踪协程的状态。
注意:asyncio.create_task() 函数在 Python 3.7 中被加入。在 Python 3.7 之前,可以改用 asyncio.ensure_future() 函数。
下面结合async awiat、事件循环和Task看一个示例
示例一:
*注意:python 3.7以后增加了asyncio.run(协程对象),效果等同于loop = asyncio.get_event_loop(),loop.run_until_complete(协程对象) *
示例二:
注意:asyncio.wait 源码内部会对列表中的每个协程执行ensure_future从而封装为Task对象,所以在和wait配合使用时task_list的值为[func(),func()] 也是可以的。
示例三: