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

1 Te11UA Apr 18, 2022 `st`是什么?`st-time.time()-5`又是什么意思 |
3 Te11UA Apr 18, 2022 你这个的确是太久了,可能是 pycharm debug 啥的各种因素,你尝试纯命令行执行呢? 在你的场景应该用定时框架,而不是用 sleep |
5 learningman Apr 18, 2022 执行也有时间的,换 apscheduler 吧 |
6 lxychn Apr 18, 2022 这个偏差也太大了,什么版本的 python ,尝试升级一下。 |
7 chenxytw Apr 18, 2022 这种时间敏感使用场景不要使用 sleep ,和是不是小脚本倒没有关系..... |
8 akira Apr 18, 2022 看实现原理。另外是不是你服务器 cpu 都爆了啊。。 |
9 dangyuluo Apr 18, 2022 感觉不应该啊。。scheduler 怎么会这么久才分配。 |
10 mansurx Apr 18, 2022 这是程序执行两次的时间差吧,每次 running 和 logging 也有时间成本,受 IO 影响,如果抢购是联网的话,还受网络因素影响。 要测试 sleep ,可以前后加个时间戳,看看差值是否稳定。 |
11 est Apr 18, 2022 你这 while 就这么几行,还是干了别的?干别的事是不是可能导致耗时? |
16 fcfangcc Apr 18, 2022 完整代码贴一下,感觉不应该 |
17 chionetw5 Apr 18, 2022 多进程写文件 IO 阻塞? |
18 guoqiao Apr 18, 2022 有没有可能,你这里的 self.running 其实是一个 property, 而它比较耗时? 或者你的 logging 正在写一个文件,而那个文件已经超大. 建议贴一下完整代码. |
19 zhangjinghua Apr 18, 2022 没有完整代码真不好确定,是不是访问互联网了啥啊,要不然把 sleep 单独弄一个线程出来 |
20 lawsiki OP @guoqiao #18 self.running 是一个 bool 标识,用于控制线程退出的,log 就打印了大概 30 行左右,完整代码大概就是 pywebview 做 UI ,然后前端一个按钮触发执行,获取到平台的抢购时间( st ),然后就是图里的逻辑,循环判断时间差等待,提前 5 秒开抢 pywebview 上看了下也没有相关的 issue |
21 ruanimal Apr 19, 2022 肯定是这个循环之外做了别的耗时操作,纯 sleep 不可能有这个问题。 没有完整代码的情况下,盲猜单线程。 |
22 killva4624 Apr 19, 2022 去掉其他所有逻辑,只运行这段循环打印看看就知道了。 |