只需睡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执行周期性动作相关推荐

  1. python浓缩(14)执行环境

    为什么80%的码农都做不了架构师?>>>    本章主题 可调用对象 代码对象 语句和内置函数 执行其他程序 终止执行 各类操作系统接口 相关模块 python 中有多种运行外部程序 ...

  2. Python(2)-第一个python程序、执行python程序三种方式

    第一个Python 程序 1. 第一个Python 程序 2. 常用两Python个版本 3. 程序执行的三种方式 3.1 解释器 3.2 交互式运行Python程序 3.3 IDE(集成开发环境)- ...

  3. 使用meterpreter让没有安装python解释器的肉鸡设备执行任意python程序

    目标设备不需安装python解释器就能让其执行python程序 # 需要在与目标meterpreter的session中加载python模块 meterpreter > load python ...

  4. Python源码剖析[19] —— 执行引擎之一般表达式(2)

    Python源码剖析 --Python执行引擎之一般表达式(2) 本文作者: Robert Chen(search.pythoner@gmail.com ) 3.2     Simple.py 前面我 ...

  5. python schedule多线程_Python-43-schedule 定时执行

    定时执行 我们经常需要定时执行一个任务. 在 python 中很多方式实现定时执行. python 官方库 time 定时执行 shed 定时执行 threading里的timer,实现非阻塞型 开源 ...

  6. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  7. Python装饰器-装饰流程,执行顺序

    最近看到一个关于Flask的CTF(RealWorld CTF 2018 web题bookhub)文章 其中的一个trick是装饰器的顺序问题,就想写篇博客回顾下装饰器~ 首先强烈推荐很久之前看的一篇 ...

  8. python安装选项_python设置执行选项参数

    1. sys 可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作 for data in sys.argv: pr ...

  9. python两个装饰器执行顺序_python中多个装饰器的执行顺序

    今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...

  10. python程序在命令行执行提示ModuleNotFoundError: No module named ‘XXX‘ 解决方法

    python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法 参考文章: (1)python程序在命令行执行提示ModuleNotFo ...

最新文章

  1. 神经进化:一种不一样的深度学习
  2. 由一行文本输入框引发的思考
  3. A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
  4. wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快...
  5. 实验吧 登录一下好吗
  6. PHP随机配菜_PHP+JS三级菜单联动菜单实现方法
  7. python设计模式pdf_精通Python设计模式 高清晰PDF+源码
  8. gevent开发http服务器与tcp服务器(WSGIServer、StreamServer)
  9. Python+matplotlib绘制箱线图并设置异常值、中值、均值显示格式
  10. 源码安装natcat
  11. python3socket非阻塞在linux里无效_Linux下socket设置为非阻塞方式和fcntl系统调用
  12. POJ1321 Bailian1321 棋盘问题【DFS】
  13. 伪随机数与采样(sampling)
  14. 基于Servlet的学生管理系统
  15. 音频格式怎么转换成mp3格式?
  16. Opencv相机校准之棋盘格标定
  17. NW.js开发环境搭建
  18. 欧可林Oclean X Pro旗舰版:大学生的私人口腔医生
  19. 动态规划----最长子序列
  20. java古诗_java--补全诗句代码

热门文章

  1. 反编译插件jadclipse和jad.exe的组合使用
  2. linux下vi编辑器的命令大全,linux下VI编辑器命令大全(超级完整版)
  3. cmd xcopy 拷贝文件夹_u盘文件夹被病毒隐藏怎么解决 u盘文件夹被病毒隐藏解决方法【详细步骤】...
  4. 我的第一个java程序_我的第一个Java程序
  5. boot客户管理系统实训报告_客户太多,客户转化困难?分析报告迟迟出不来,CRM客户管理系统助你一臂之力...
  6. html5语音读取文字_文字识别神器最新版-文字识别神器安卓版下载
  7. element-ui中table表格表头和表格内容都水平居中
  8. springBoot框架方法上面添加@Transactional注解的使用
  9. CentOS 修改主机名(host)
  10. @ApiImplicitParam注解的dataType、paramType两个属性的区别?