惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园_首页
D
Docker
S
Security @ Cisco Blogs
K
Kaspersky official blog
爱范儿
爱范儿
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Troy Hunt's Blog
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Hacker News
The Hacker News
美团技术团队
S
SegmentFault 最新的问题
L
Lohrmann on Cybersecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Martin Fowler
Martin Fowler
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Vercel News
Vercel News
The Cloudflare Blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
AI
AI
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
Scott Helme
Scott Helme
S
Schneier on Security
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
S
Securelist
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 川川籽

GO面试题:new 和 map 的区别 minikube dashboard ImagePullBackOff 失败问题的解决方法 hashicorp/raft模块实现的raft集群存在节点跨集群身份冲突问题 macos 13安装openvpn - 川川籽 [转发] Go pprof内存指标含义备忘录 自己搭建一个https的dns,让不同的浏览器使用不同的DNS,使用相同的域名访问到不同的主机上 记一次docker buildx build 推送到本地私有仓库出现 connection refused 的问题 Linux C 获取本机IPV4和IPV6地址列表 Mac M1 安装python3.6.x golang map 和 interface 的一些记录 MacOS M1 安装python3.5 使用php的openssl_encrypt和python的pycrypt进行跨语言的对称加密和解密问题 golang random string 【转载】coroutine 与 goroutine 区别 'invalid flag in #cgo LDFLAGS: -w' 问题解决 记录一次python的mysqlclient依赖库报错问题 airflow当触发具有多层subDAG的任务的时候,出现[Duplicate entry ‘xxxx’ for key dag_id]的错误的问题处理 Python3并发写文件 python hash 每次调用结果不一样
python简单的time ticker
川川籽 · 2021-03-17 · via 博客园 - 川川籽

在某些时候,我们需要精确的启动一个func,如果用time.sleep简单的轮询,会因为执行的任务阻塞,或者其他原因导致无法精确的定时执行。

例如在采集某些数据的时候,需要精确的每60秒采集一次,如果直接简单的轮询:{1:计时1,2:采集,3:计时2,4:sleep(60-计时2-计时1)},正常的时候看起来没什么问题。

但是如果在第二步“采集”的时候阻塞超过60秒,那就会导致后续的采集延迟了。

因此需要一个新的定时器,精确的定时触发操作,不管每一步操作有没有完成,到下一个时刻都要开始触发新的操作。

如下代码,每隔4s触发do_job这个函数,在这个函数中,如果触发次数是3的倍数,则sleep 5,其他则sleep 2。

import threading
import time
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(levelname)s - %(message)s"
)


def do_job(count):
    logging.info("[%s] start job" % count)
    if count % 3 == 0:
        time.sleep(5)
    else:
        time.sleep(2)
    logging.info("[%s] end job" % count)


def thread_time_running(max_runs=10):
    alive_timers = []
    for i in range(0, max_runs):
        t = threading.Timer(4, do_job, [i,])
        logging.info("starting thread %d" % i)
        t.start()
        logging.info("warning thread %d" % i)
        t.join(timeout=4)
        if t.is_alive():
            alive_timers.append(t)

    for i, t in enumerate(alive_timers):
        if t.is_alive():
            t.join()


thread_time_running()

执行之后如下:

2021-03-17 20:49:50,736 - INFO - starting thread 0
2021-03-17 20:49:50,736 - INFO - warning thread 0
2021-03-17 20:49:54,742 - INFO - [0] start job
2021-03-17 20:49:54,742 - INFO - starting thread 1
2021-03-17 20:49:54,742 - INFO - warning thread 1
2021-03-17 20:49:58,748 - INFO - [1] start job
2021-03-17 20:49:58,748 - INFO - starting thread 2
2021-03-17 20:49:58,749 - INFO - warning thread 2
2021-03-17 20:49:59,746 - INFO - [0] end job
2021-03-17 20:50:00,753 - INFO - [1] end job
2021-03-17 20:50:02,754 - INFO - starting thread 3
2021-03-17 20:50:02,754 - INFO - [2] start job
2021-03-17 20:50:02,755 - INFO - warning thread 3
2021-03-17 20:50:04,755 - INFO - [2] end job
2021-03-17 20:50:06,759 - INFO - [3] start job
2021-03-17 20:50:06,759 - INFO - starting thread 4
2021-03-17 20:50:06,760 - INFO - warning thread 4
2021-03-17 20:50:10,765 - INFO - [4] start job
2021-03-17 20:50:10,765 - INFO - starting thread 5
2021-03-17 20:50:10,766 - INFO - warning thread 5
2021-03-17 20:50:11,761 - INFO - [3] end job
2021-03-17 20:50:12,770 - INFO - [4] end job
2021-03-17 20:50:14,771 - INFO - [5] start job
2021-03-17 20:50:14,771 - INFO - starting thread 6
2021-03-17 20:50:14,772 - INFO - warning thread 6
2021-03-17 20:50:16,775 - INFO - [5] end job
2021-03-17 20:50:18,774 - INFO - [6] start job
2021-03-17 20:50:18,774 - INFO - starting thread 7
2021-03-17 20:50:18,774 - INFO - warning thread 7
2021-03-17 20:50:22,777 - INFO - starting thread 8
2021-03-17 20:50:22,777 - INFO - [7] start job
2021-03-17 20:50:22,778 - INFO - warning thread 8
2021-03-17 20:50:23,776 - INFO - [6] end job
2021-03-17 20:50:24,783 - INFO - [7] end job
2021-03-17 20:50:26,783 - INFO - starting thread 9
2021-03-17 20:50:26,783 - INFO - [8] start job
2021-03-17 20:50:26,784 - INFO - warning thread 9
2021-03-17 20:50:28,786 - INFO - [8] end job
2021-03-17 20:50:30,787 - INFO - [9] start job
2021-03-17 20:50:35,790 - INFO - [9] end job