3

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

 2 years ago
source link: https://www.v2ex.com/t/847591
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Python

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

  lawsiki · 17 小时 59 分钟前 · 1776 次点击

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

WechatIMG26507.png

19 条回复    2022-04-18 18:11:36 +08:00

Te11UA

Te11UA      17 小时 46 分钟前

`st`是什么?`st-time.time()-5`又是什么意思

lawsiki

lawsiki      17 小时 44 分钟前

@Te11UA #1 st 是平台的开抢时间戳,-5 是提前 5 秒开抢

Te11UA

Te11UA      17 小时 31 分钟前

你这个的确是太久了,可能是 pycharm debug 啥的各种因素,你尝试纯命令行执行呢?
在你的场景应该用定时框架,而不是用 sleep

lawsiki

lawsiki      17 小时 15 分钟前

@Te11UA #3 有道理,没想过 debug 的原因,本来就是一个小脚本,sleep 足矣,用定时框架的话就是杀鸡用牛刀了

learningman

learningman      16 小时 33 分钟前

执行也有时间的,换 apscheduler 吧

lxychn

lxychn      16 小时 22 分钟前

这个偏差也太大了,什么版本的 python ,尝试升级一下。

chenxytw

chenxytw      16 小时 19 分钟前

这种时间敏感使用场景不要使用 sleep ,和是不是小脚本倒没有关系.....

akira

akira      15 小时 49 分钟前

看实现原理。另外是不是你服务器 cpu 都爆了啊。。

dangyuluo

dangyuluo      15 小时 46 分钟前

感觉不应该啊。。scheduler 怎么会这么久才分配。

mansurx

mansurx      13 小时 36 分钟前

这是程序执行两次的时间差吧,每次 running 和 logging 也有时间成本,受 IO 影响,如果抢购是联网的话,还受网络因素影响。

要测试 sleep ,可以前后加个时间戳,看看差值是否稳定。

est

est      13 小时 30 分钟前

你这 while 就这么几行,还是干了别的?干别的事是不是可能导致耗时?

lawsiki

lawsiki      12 小时 51 分钟前

@lxychn #6 3.8 的,应该不算旧了

lawsiki

lawsiki      12 小时 51 分钟前

@akira #8 没有,本地跑的,CPU 很空闲

lawsiki

lawsiki      12 小时 50 分钟前

@mansurx #10 就这一段代码,不涉及网络,大部分情况下正常的,这种情况偶发性

lawsiki

lawsiki      12 小时 49 分钟前

@est #11 就循环在这里打印,没有其他代码了

fcfangcc

fcfangcc      10 小时 40 分钟前

完整代码贴一下,感觉不应该

chionetw5

chionetw5      10 小时 20 分钟前

多进程写文件 IO 阻塞?

guoqiao

guoqiao      10 小时 17 分钟前

有没有可能,你这里的 self.running 其实是一个 property, 而它比较耗时?
或者你的 logging 正在写一个文件,而那个文件已经超大.
建议贴一下完整代码.

zhangjinghua

zhangjinghua      10 小时 9 分钟前

没有完整代码真不好确定,是不是访问互联网了啥啊,要不然把 sleep 单独弄一个线程出来

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK