Python 的 time.sleep 时间不准什么原因?

2022-04-18 10:22:08 +08:00
 lawsiki

做了一个抢购脚本,大概逻辑就是获取开抢时间,然后判断当前时间差,超过 60 秒时每 30 秒检测一次,否则 0.5 秒检测一次,但是从打印日志上看,有时候理论休眠 0.5 秒的实际等了四五秒才执行,如果偏差一点我理解是没有获取到 CPU 时间片导致的,不过这偏差实在有点大,这是什么原因?

4585 次点击
所在节点    Python
24 条回复
Te11UA
2022-04-18 10:35:12 +08:00
`st`是什么?`st-time.time()-5`又是什么意思
lawsiki
2022-04-18 10:36:36 +08:00
@Te11UA #1 st 是平台的开抢时间戳,-5 是提前 5 秒开抢
Te11UA
2022-04-18 10:50:11 +08:00
你这个的确是太久了,可能是 pycharm debug 啥的各种因素,你尝试纯命令行执行呢?
在你的场景应该用定时框架,而不是用 sleep
lawsiki
2022-04-18 11:05:38 +08:00
@Te11UA #3 有道理,没想过 debug 的原因,本来就是一个小脚本,sleep 足矣,用定时框架的话就是杀鸡用牛刀了
learningman
2022-04-18 11:47:49 +08:00
执行也有时间的,换 apscheduler 吧
lxychn
2022-04-18 11:59:31 +08:00
这个偏差也太大了,什么版本的 python ,尝试升级一下。
chenxytw
2022-04-18 12:02:08 +08:00
这种时间敏感使用场景不要使用 sleep ,和是不是小脚本倒没有关系.....
akira
2022-04-18 12:31:35 +08:00
看实现原理。另外是不是你服务器 cpu 都爆了啊。。
dangyuluo
2022-04-18 12:35:11 +08:00
感觉不应该啊。。scheduler 怎么会这么久才分配。
mansurx
2022-04-18 14:45:19 +08:00
这是程序执行两次的时间差吧,每次 running 和 logging 也有时间成本,受 IO 影响,如果抢购是联网的话,还受网络因素影响。

要测试 sleep ,可以前后加个时间戳,看看差值是否稳定。
est
2022-04-18 14:50:51 +08:00
你这 while 就这么几行,还是干了别的?干别的事是不是可能导致耗时?
lawsiki
2022-04-18 15:29:46 +08:00
@lxychn #6 3.8 的,应该不算旧了
lawsiki
2022-04-18 15:30:16 +08:00
@akira #8 没有,本地跑的,CPU 很空闲
lawsiki
2022-04-18 15:31:23 +08:00
@mansurx #10 就这一段代码,不涉及网络,大部分情况下正常的,这种情况偶发性
lawsiki
2022-04-18 15:32:05 +08:00
@est #11 就循环在这里打印,没有其他代码了
fcfangcc
2022-04-18 17:40:52 +08:00
完整代码贴一下,感觉不应该
chionetw5
2022-04-18 18:00:47 +08:00
多进程写文件 IO 阻塞?
guoqiao
2022-04-18 18:04:29 +08:00
有没有可能,你这里的 self.running 其实是一个 property, 而它比较耗时?
或者你的 logging 正在写一个文件,而那个文件已经超大.
建议贴一下完整代码.
zhangjinghua
2022-04-18 18:11:36 +08:00
没有完整代码真不好确定,是不是访问互联网了啥啊,要不然把 sleep 单独弄一个线程出来
lawsiki
2022-04-19 09:40:50 +08:00
@guoqiao #18 self.running 是一个 bool 标识,用于控制线程退出的,log 就打印了大概 30 行左右,完整代码大概就是 pywebview 做 UI ,然后前端一个按钮触发执行,获取到平台的抢购时间( st ),然后就是图里的逻辑,循环判断时间差等待,提前 5 秒开抢

pywebview 上看了下也没有相关的 issue

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX