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 · 70 天前 · 3423 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    WechatIMG26507.png

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

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

    pywebview 上看了下也没有相关的 issue
    ruanimal
        21
    ruanimal  
       69 天前
    肯定是这个循环之外做了别的耗时操作,纯 sleep 不可能有这个问题。

    没有完整代码的情况下,盲猜单线程。
    killva4624
        22
    killva4624  
       69 天前
    去掉其他所有逻辑,只运行这段循环打印看看就知道了。
    guoqiao
        23
    guoqiao  
       69 天前
    @lawsiki 所以问题应该是 pywebview 导致的?
    lawsiki
        24
    lawsiki  
    OP
       68 天前
    @guoqiao #23 应该是 pycharm 或 debug 模式导致的,命令行运行正常
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2924 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:23 · PVG 20:23 · LAX 05:23 · JFK 08:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.