V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lawsiki
V2EX  ›  Python

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

  •  
  •   lawsiki · 2022-04-18 10:22:08 +08:00 · 4261 次点击
    这是一个创建于 710 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    WechatIMG26507.png

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

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

    pywebview 上看了下也没有相关的 issue
    ruanimal
        21
    ruanimal  
       2022-04-19 10:11:04 +08:00
    肯定是这个循环之外做了别的耗时操作,纯 sleep 不可能有这个问题。

    没有完整代码的情况下,盲猜单线程。
    killva4624
        22
    killva4624  
       2022-04-19 14:39:41 +08:00
    去掉其他所有逻辑,只运行这段循环打印看看就知道了。
    guoqiao
        23
    guoqiao  
       2022-04-19 17:49:05 +08:00
    @lawsiki 所以问题应该是 pywebview 导致的?
    lawsiki
        24
    lawsiki  
    OP
       2022-04-20 16:45:10 +08:00
    @guoqiao #23 应该是 pycharm 或 debug 模式导致的,命令行运行正常
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1187 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:16 · PVG 02:16 · LAX 11:16 · JFK 14:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.