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