python周期执行-用Python执行周期性动作
只需睡10秒或使用threading.Timer(10,foo)会导致启动时间漂移。(你可能不在乎这一点,或者它可能是一个重要的问题来源,取决于你的确切情况。)造成这种情况的原因有两个-线程的唤醒时间或函数的执行时间不准确。
您可以在这篇文章的末尾看到一些结果,但首先是一个如何修复它的示例。您需要跟踪您的函数下一次调用的时间,而不是它实际被调用的时间,并说明不同之处。
这里有一个稍微偏移的版本:
import datetime, threading
def foo():
print datetime.datetime.now()
threading.Timer(1, foo).start()
foo()
其输出如下:
2013-08-12 13:05:36.483580
2013-08-12 13:05:37.484931
2013-08-12 13:05:38.485505
2013-08-12 13:05:39.486945
2013-08-12 13:05:40.488386
2013-08-12 13:05:41.489819
2013-08-12 13:05:42.491202
2013-08-12 13:05:43.492486
2013-08-12 13:05:44.493865
2013-08-12 13:05:45.494987
2013-08-12 13:05:46.496479
2013-08-12 13:05:47.497824
2013-08-12 13:05:48.499286
2013-08-12 13:05:49.500232
你可以看到,亚秒计数不断增加,因此,开始时间是“漂移”。
这是正确解释漂移的代码:
import datetime, threading, time
next_call = time.time()
def foo():
global next_call
print datetime.datetime.now()
next_call = next_call+1
threading.Timer( next_call - time.time(), foo ).start()
foo()
其输出如下:
2013-08-12 13:21:45.292565
2013-08-12 13:21:47.293000
2013-08-12 13:21:48.293939
2013-08-12 13:21:49.293327
2013-08-12 13:21:50.293883
2013-08-12 13:21:51.293070
2013-08-12 13:21:52.293393
在这里,你可以看到,不再有任何增加的亚秒的倍。
如果您的事件确实经常发生,您可能希望在单个线程中运行计时器,而不是为每个事件启动一个新线程。在考虑漂移的同时,这看起来是这样的:
import datetime, threading, time
def foo():
next_call = time.time()
while True:
print datetime.datetime.now()
next_call = next_call+1;
time.sleep(next_call - time.time())
timerThread = threading.Thread(target=foo)
timerThread.start()
但是您的应用程序不会正常退出,您需要关闭计时器线程。如果要在完成应用程序时正常退出,而不手动关闭线程,则应使用
timerThread = threading.Thread(target=foo)
timerThread.daemon = True
timerThread.start()
python周期执行-用Python执行周期性动作相关推荐
- python浓缩(14)执行环境
为什么80%的码农都做不了架构师?>>> 本章主题 可调用对象 代码对象 语句和内置函数 执行其他程序 终止执行 各类操作系统接口 相关模块 python 中有多种运行外部程序 ...
- Python(2)-第一个python程序、执行python程序三种方式
第一个Python 程序 1. 第一个Python 程序 2. 常用两Python个版本 3. 程序执行的三种方式 3.1 解释器 3.2 交互式运行Python程序 3.3 IDE(集成开发环境)- ...
- 使用meterpreter让没有安装python解释器的肉鸡设备执行任意python程序
目标设备不需安装python解释器就能让其执行python程序 # 需要在与目标meterpreter的session中加载python模块 meterpreter > load python ...
- Python源码剖析[19] —— 执行引擎之一般表达式(2)
Python源码剖析 --Python执行引擎之一般表达式(2) 本文作者: Robert Chen(search.pythoner@gmail.com ) 3.2 Simple.py 前面我 ...
- python schedule多线程_Python-43-schedule 定时执行
定时执行 我们经常需要定时执行一个任务. 在 python 中很多方式实现定时执行. python 官方库 time 定时执行 shed 定时执行 threading里的timer,实现非阻塞型 开源 ...
- [python教程入门学习]python学习笔记(CMD执行文件并传入参数)
本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...
- Python装饰器-装饰流程,执行顺序
最近看到一个关于Flask的CTF(RealWorld CTF 2018 web题bookhub)文章 其中的一个trick是装饰器的顺序问题,就想写篇博客回顾下装饰器~ 首先强烈推荐很久之前看的一篇 ...
- python安装选项_python设置执行选项参数
1. sys 可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作 for data in sys.argv: pr ...
- python两个装饰器执行顺序_python中多个装饰器的执行顺序
今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...
- python程序在命令行执行提示ModuleNotFoundError: No module named ‘XXX‘ 解决方法
python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法 参考文章: (1)python程序在命令行执行提示ModuleNotFo ...
最新文章
- 神经进化:一种不一样的深度学习
- 由一行文本输入框引发的思考
- A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
- wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快...
- 实验吧 登录一下好吗
- PHP随机配菜_PHP+JS三级菜单联动菜单实现方法
- python设计模式pdf_精通Python设计模式 高清晰PDF+源码
- gevent开发http服务器与tcp服务器(WSGIServer、StreamServer)
- Python+matplotlib绘制箱线图并设置异常值、中值、均值显示格式
- 源码安装natcat
- python3socket非阻塞在linux里无效_Linux下socket设置为非阻塞方式和fcntl系统调用
- POJ1321 Bailian1321 棋盘问题【DFS】
- 伪随机数与采样(sampling)
- 基于Servlet的学生管理系统
- 音频格式怎么转换成mp3格式?
- Opencv相机校准之棋盘格标定
- NW.js开发环境搭建
- 欧可林Oclean X Pro旗舰版:大学生的私人口腔医生
- 动态规划----最长子序列
- java古诗_java--补全诗句代码
热门文章
- 反编译插件jadclipse和jad.exe的组合使用
- linux下vi编辑器的命令大全,linux下VI编辑器命令大全(超级完整版)
- cmd xcopy 拷贝文件夹_u盘文件夹被病毒隐藏怎么解决 u盘文件夹被病毒隐藏解决方法【详细步骤】...
- 我的第一个java程序_我的第一个Java程序
- boot客户管理系统实训报告_客户太多,客户转化困难?分析报告迟迟出不来,CRM客户管理系统助你一臂之力...
- html5语音读取文字_文字识别神器最新版-文字识别神器安卓版下载
- element-ui中table表格表头和表格内容都水平居中
- springBoot框架方法上面添加@Transactional注解的使用
- CentOS 修改主机名(host)
- @ApiImplicitParam注解的dataType、paramType两个属性的区别?