使用关键词 def 声明这是一个函数
①.def 函数名 (参数):
参数可以没有,也可以有多个,用逗号隔开,第一行称为函数头,结尾一定要加冒号,代表开始进入函数体的执行.
语句块也就是函数体,是关于这个函数要实现的功能的语句,语句要有返回值即return语句,如果没有return语句,就代表return none.
在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回
函数体
函数代码以def关键词开头,后接函数标识符名称和圆括号():
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
函数的第一行语句可以选择性的使用文档字符串-用于存放函数说明
函数内容以冒号起始,并且缩进
return[表达式]结束函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None
如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点:
①不方便执行 秒级的任务 .
另外一个选择是 Celery,但是 Celery 的配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择.
在你想要使用一个轻量级的任务调度工具,而且希望它尽量简单、容易使用、不需要外部依赖,最好能够容纳 Crontab 的所有基本功能,那么 Schedule 模块是你的不二之选.
使用它来调度任务可能只需要几行代码,感受一下:
上面的代码表示每10分钟执行一次 job 函数,非常简单方便.你只需要引入 schedule 模块,通过调用 scedule.every(时间数).时间类型.do(job) 发布周期任务.
发布后的周期任务需要用 run_pending 函数来检测是否执行,所以呢需要一个 While 循环不断地轮询这个函数.
下面具体讲讲Schedule模块的安装和初级、进阶使用方法.
①准备
请选择以下任一种方式输入命令安装依赖 :
① Windows 环境 打开 Cmd (开始-运行-CMD).
最基本的使用在文首已经提到过,下面给大家展示更多的调度任务例子:
可以看到,从月到秒的配置,上面的例子都覆盖到了.不过 如果你想只运行一次任务 的话,可以这么配:
参数传递
如果你有参数需要传递给作业去执行,你只需要这么做:
获取目前所有的作业
如果你想获取目前所有的作业:
取消所有作业
如果某些机制触发了,你需要立即清除当前程序的所有作业:
标签功能
在设置作业的时候,为了后续方便管理作业,你可以给作业打个标签,这样你可以通过标签过滤获取作业或取消作业.
设定作业截止时间
如果你需要让某个作业到某个时间截止,你可以通过这个方法:
截止日期之后,该作业将无法运行.
立即运行所有作业,而不管其安排如何
如果某个机制触发了,你需要立即运行所有作业,可以调用 schedule.run_all :
装饰器安排作业
如果你觉得设定作业这种形式太啰嗦了,也可以使用装饰器模式:
并行执行
默认情况下,Schedule 按顺序执行所有作业.其背后的原因是,很难找到让每个人都高兴的并行执行模型.
不过你可以通过多线程的形式来运行每个作业以解决此限制:
日志记录
Schedule 模块同时也支持 logging 日志记录,这么使用:
效果如下:
异常处理
Schedule 不会自动捕捉异常,它遇到异常会直接抛出,这会导致一个严重的问题: 后续所有的作业都会被中断执行 ,所以呢我们需要捕捉到这些异常.
你可以手动捕捉,但是某些你预料不到的情况需要程序进行自动捕获,加一个装饰器就能做到了:
这样, bad_task 在执行时遇到的任何错误,都会被 catch_exceptions 捕获,这点在保证调度任务正常运转的时候非常关键.
①计算生日是星期几
当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~
①.).我们先把变量格式化成一个datetime对象
birthday=datetime.datetime.strptime(gf_birthday,'%Y-%m-%d')
birthday.weekday()
weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
weekdays[birthday.weekday()]
当然你要计算比如情人节,圣诞节什么的都可以用上面的程序,或者整个列表把10年的节日都罗列计算一下都是可以了,是不是很简单,对日期的理解有木有加深了一下下
用Python怎么破很简单,下面这个程序轻松搞定
我们先从一个最简单的例子说,假设我们是每分种的第10秒,去执行一个任务去打印一下当前的目录
①.).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')
a.我们先获取当前的时间
now=datetime.datetime.now()
b.然后我们输入一个你要定时执行的target时间
比如你是x分10秒的时候执行sched_Timer=datetime.datetime(x,x,x,x,x,10)
前面的x是并不重要(只要最后是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就变成每天的定时任务
await + 可等待的对象(协程对象、Future对象、Task对象 - IO等待)
事件循环,可以把他当做是一个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对象,并将协程立即加入事件循环,同时追踪协程的状态.
下面结合async awiat、事件循环和Task看一个示例
示例一:
示例二:
注意:asyncio.wait 源码内部会对列表中的每个协程执行ensure_future从而封装为Task对象,所以在和wait配合使用时task_list的值为[func(),func()] 也是可以的.
示例三:
以上就是土嘎嘎小编为大家整理的Python写周期函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!