跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Python 做一个闹钟,用 while 循环等待时间是否是一个好办法
未分類
2020 年 10 月 25 日

Python 做一个闹钟,用 while 循环等待时间是否是一个好办法

Python 做一个闹钟,用 while 循环等待时间是否是一个好办法

資深大佬 : sudoy 7

我在做一个闹钟,等到谋个时间就开始执行谋个动作(在下面的案例里面简化为 print('ok'))。请问这是否是最佳办法?因为我担心会不会导致占用内存过高等问题。我看有一个叫 alarm 的库,也是用 while 循环等待时间。以下是我的示例代码:

在 2020 年 10 月 17 日 10 点 50 分 50 秒的时候触发事件 print('ok')

from datetime import datetime  def alarm():  while True:   now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")   if now == '2020-10-17 10:50:50':    print('ok')    break   if __name__ == '__main__':  alarm() 

大佬有話說 (100)

  • 資深大佬 : duyuyouci

    可以用 celery 做定时任务啊

  • 資深大佬 : ruanimal

    循环里加个 sleep 吧,不然 cpu 都占满了

  • 資深大佬 : nevin47

    CPU 都炸了。。。。。。

  • 資深大佬 : RRRoger

    用操作系统的定时任务触发是不是会更好点

  • 資深大佬 : vZexc0m

    可以用 APScheduler

  • 資深大佬 : yaoye555

    crontab 或许更值得拥有

  • 資深大佬 : qile1

    这样应该可以,但是有时候 print 有数据,程序确不执行挺奇怪,好像也没有啥好办法

  • 資深大佬 : ysc3839

    内存占用不高,CPU 使用率会高。如果不想使用操作系统独有的 API 的话,那就加上 sleep 吧。

  • 資深大佬 : no1xsyzy

    占满一个核,内存不会泄漏
    不要用等于判断时间

  • 資深大佬 : stephenxiaxy

    。。。

  • 資深大佬 : MoYi123

    不如 asyncio.sleep

  • 資深大佬 : MagnifierSun

    ??? 你知道这个语句一秒钟要执行多少遍吗哈哈哈
    有个 Schedule 的库,自己去搜搜

  • 資深大佬 : Chenamy2017

    加 sleep 即可,时间也不要用==,超过这个时间后就执行动作。

  • 資深大佬 : Sapp

    你这个时间必出坑…

  • 資深大佬 : kimqcn

    谁把我的代码偷出来了呵呵呵

  • 資深大佬 : Vhc001

    这是我见过最坑爹的代码

  • 資深大佬 : Chaidu

    建议转行 (狗头

  • 資深大佬 : Tokiomi

    哈哈哈,学生代码吧

  • 主 資深大佬 : sudoy

    谢谢大家回复,看来是用 sleep 比较合适。 @duyuyouci celery 可能比较重型了,我想尽量简单点,轻量级的。不过感谢推荐。 @vZexc0m APScheduler 看起来不错,不过还没有用过这个库,回头研究一下

  • 資深大佬 : est

    其实底层库就是你这样实现的。只不过加了很多东西。比如上面说的要加个 sleep(1) 这就是你最小定时精度。

  • 主 資深大佬 : sudoy

    @Sapp @kimqcn 所以来请教你们啊 🙂

  • 主 資深大佬 : sudoy

    @Chaidu 本来就不是程序猿 哈哈哈,业余爱好者

  • 資深大佬 : widewing

    sleep 为什么要加在循环里?直接 sleep 指定时间不香吗?

  • 資深大佬 : dswyzx

    别听他们的,加 sleep 万一错过这个点了呢,大于等于时间万一没有拯救世界成功呢。
    综上所述:能用就行!

  • 資深大佬 : imdong

    之前有过类似的需求,不过我的做法是用 sleep 但是不是 sleep(1)
    而是再执行完毕后,检查距离下一次执行的时间差,然后睡眠到那个时间。

  • 資深大佬 : shuax

    sleep(0)即可

  • 資深大佬 : est

    @widewing 设想一个场景。你在虚拟机里跑起来了这个程序。你让虚拟机暂停了。然后 1 个小时后,恢复了虚拟机。这个时候你的 sleep 还是对的吗。

  • 主 資深大佬 : sudoy

    @est 哈哈,虽然我找半天没有找到 python 内置的 `sleep()` 是怎么写的,你的话听起来还挺鼓励人的。不过他们说这样写会导致 CUP 占用过高,可能确实没有用 sleep 好,sleep 没有这么高的 CUP 占用。

  • 資深大佬 : wusheng0

    是不是 fork 一个进程后台运行更好,
    有没有大佬来说一下

  • 資深大佬 : felixcode

    多开几个闹钟就能把多核 CPU 占满了。

  • 主 資深大佬 : sudoy

    @shuax sleep(0) 也是解决不了 CUP 占用过高的问题的
    ![]( Python 做一个闹钟,用 while 循环等待时间是否是一个好办法)

  • 資深大佬 : zkqiang

    没让你 sleep 0 啊。。直接计算 定时减去现在 有多少秒,sleep 多少秒就行了

  • 資深大佬 : ljsh093

    @imdong 设定好 sleep 以后不就没法取消了?只能从外部打断重新设置时间?

  • 資深大佬 : zkqiang

    或者 sleep(0.5) 每半秒检查一次,另外时间不要用 == 判断,最好用区间判断允许一些误差

  • 資深大佬 : imdong

    @ljsh093 没有取消的需求,如果有,就在执行前做个判断,一样。

    但是会有类似主说的睡眠唤醒的问题。

  • 資深大佬 : bruce00

    狗头真的能保命

  • 資深大佬 : heyjei

    我真的在生产环境见过这样的代码,你们应该能够理解我当时的心情。

  • 資深大佬 : user8341

    sleep(0)真实绝了。

  • 資深大佬 : jerfoxu

    @imdong 这个方法可以哟!

  • 資深大佬 : Norie

    这是 CPU 性能测试

  • 資深大佬 : fuchunliu

    你是对的,他要听他们的,不然别人说你跑的假程序,CPU 都没占用

  • 資深大佬 : ysc3839

    @est Windows 有 SetThreadpoolTimer,这个可以设置绝对时间,不受睡眠影响,还可以设置允许系统推迟执行,相比 sleep 更加省电。

  • 資深大佬 : winglight2016

    @heyjei 这样的生产环境还能有任何“生产”吗?

  • 資深大佬 : Bijiabo

    看到 sleep(0) 笑死我了哈哈哈

  • 資深大佬 : lazyfighter

    既然 sleep,为什么不算一下 sleep 多长时间呢

  • 資深大佬 : ThisQ

    用系统定时任务调用脚本执行呢?

  • 資深大佬 : ysc3839

    @wusheng0 我一般会选择用新线程来后台执行,fork 在某些操作系统上有坑,比如 Windows 没有 fork,macOS fork 之后不 exec 没法使用 CoreFoundation 。用线程的话可以共享资源,也没有那么多坑。

  • 資深大佬 : zgzb

    我选择 after

  • 資深大佬 : nine9

    可以考虑 threading.Event()

    event.wait(timeout=None)
    event.set()

    也就是 APScheduler 这个库实现使用的

  • 資深大佬 : est

    @ysc3839 这个就是 OS 帮你做了很多脏活。。。

  • 資深大佬 : 0bit

    sleep 的问题已经很多人说了,我提一下关于时间比对的问题吧。
    现在这样用 str 比对,容易有小坑,还是应该用更本质的数据去比对,比如 unix timestamp,更不容易出错。

  • 資深大佬 : nuk

    最好调整成实时优先级,不然这一秒容易被跳过

  • 資深大佬 : findlisa

    @ruanimal 为啥,一个循环就能把 cpu 占满吗

  • 資深大佬 : DoctorCat

    兼容 posix 标准的系统还可以利用系统信号:signal 、setitimer 定时器交给 OS 去做了

  • 資深大佬 : ma7x

    win10 自带闹钟超级好用 为什么要造轮子

  • 資深大佬 : www5070504

    你这种写法 每天多费半度电吧 加个 timer 之类的 sleep 都行啊

  • 資深大佬 : SmartKeyerror

    单线程直接用信号不就好了,向内核注册一个定时器,定时器到期后向进程发送 SIGALRM 信号。

  • 資深大佬 : darknoll

    传说中的忙等待自旋锁?

  • 資深大佬 : fish267

    还是 crontab 吧

  • 資深大佬 : muzuiget

    哈哈,我也想到传说中的自旋锁。

  • 資深大佬 : xionger

    哈哈 劝改行

  • 資深大佬 : ruanimal

    @findlisa 每时每刻都在判断时间是否相等,也就是 cpu 一直是忙碌的状态,自然就会占满一个核心。如果有 sleep,cpu 在你程序 sleep 的期间就干别的,或者休息去了。

    ps: 去看看操作系统的书,看看进程的调度。

  • 資深大佬 : GoLand

    淦,这么精妙的代码我怎么想不到。

  • 資深大佬 : shuax

    哎哟,我错了,sleep 0 确实不行,起码得 0.001

  • 資深大佬 : kiracyan

    硬是要这么做建议你 sleep 个 300 秒 然后判断一下当前时间距离设定时间是不是小于 300 秒 再 sleep 1 秒

  • 資深大佬 : shenqi

    。。。明显的实习生写的代码。

    (又不是不能用.jpg )

  • 資深大佬 : lchy

    这个算今日最佳 [欢乐贴] 么?

  • 資深大佬 : jimmyismagic

    评论里说实习生写的代码的,自己可以写一个出来试试,看能做到多高的精度,要做到等于而不是大于等于

  • 資深大佬 : caiji11

    @xionger 头像可爱 大熊 这个哪里不太好

  • 資深大佬 : sapocaly

    1.https://docs.python.org/3.7/library/sched.html
    2.就是想写代码:用 sleep 或用 os api
    3.用现有 pkg

  • 資深大佬 : iSecret

    用 crontab 执行任务的话没这么多蛋疼的事还可以顺道解决了可能需要重复执行的问题,非要用 py 建议 sleep(执行时间 – 当前时间)。

  • 資深大佬 : tabris17

    实现了一个野生 spinning

  • 資深大佬 : lane1

    用术语来说, 你的写法是 spinlock, busy-waiting, CPU-bound… 不过话说计时器到底如何实现呢?

  • 資深大佬 : Tonni

    哈哈,别的不说,主头像的狗子好可爱

  • 資深大佬 : UN2758

    lz 这么狂野的写法,怀念当年的我,哈哈哈哈

  • 資深大佬 : JCZ2MkKb5S8ZX9pq

    直接算 timestamp 的时间差,sleep 一次到底不就好了。
    这个格式化时间的操作有点多余,重复计算没必要啊。

  • 資深大佬 : wuwukai007

    直接计算时间差,sleep,每次激活的时候重新计算,

  • 資深大佬 : lysS

    想到见过 JS 延时函数:
            function sleepSync(ms) {
                var curr = new Date().getTime();
                ms += curr;
                while (curr < ms) {
                    curr = new Date().getTime();
                }
            }

  • 資深大佬 : CSM

    直接一觉睡到目标时间,醒来后完成任务就行,循环也不用

  • 資深大佬 : echoick

    哈哈哈哈 sleep(0)

  • 資深大佬 : inframe

    我真的在生产环境见过这样的代码,你们应该能够理解我当时的心情。

    +1

  • 資深大佬 : ctro15547

    延迟 0.1 秒就行 。。

  • 資深大佬 : E1n

    哈哈加油

  • 資深大佬 : Yinz

    不得不说,主心态蛮好的,加油,谁都有新手阶段,学习即可

  • 資深大佬 : by73

    突然对 time.sleep 有了点兴趣,最后发现居然调用的是 select() 系统调用

  • 資深大佬 : irytu

    os.sched_yield()

    不过 Windows 上没有这种方法 我一般为了 portable 会写成 time.sleep(0.0001)

  • 資深大佬 : vcfghtyjc

    运行时候检测一下当前时间,然后算出需要的睡眠时间,sleep 就行了

  • 資深大佬 : shijingshijing

    sleep(0)没毛病,代码不改,在 crontab 里面设定 2020 年 10 月 17 日 10 点 50 分 50 秒执行一次就 ok 了。

  • 資深大佬 : discrete

    想起了 Sleep Sort.

  • 主 資深大佬 : sudoy

    @nuk 谢谢!请问具体怎么操作?

  • 主 資深大佬 : sudoy

    @ma7x 这个问题问的好。当然是定时调用 API 啦,Windows 10 自带的闹钟并非可编程的

  • 資深大佬 : inorilzy

    APScheduler 和 celery 都可以定时任务。

  • 資深大佬 : findlisa

    @ruanimal 好的

  • 資深大佬 : raymanr

    @sudoy 如果纯粹是为了定时的话, 就 windows 的任务计划就挺好, 而且足够可靠, 自己写会有很多坑

  • 主 資深大佬 : sudoy

    @raymanr 谢谢

  • 資深大佬 : nuistzhou

    为何我想起了大名鼎鼎的“睡眠排序法”?!

  • 主 資深大佬 : sudoy

    @nuistzhou 就是那个从天而降的掌法吗?

  • 資深大佬 : adamwong

    @SmartKeyerror 我怎么又抓到你了

  • 資深大佬 : nuk

    @sudoy
    import win32api,win32process,win32con

    pid = win32api.GetCurrentProcessId()
    handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
    win32process.SetPriorityClass(handle, win32process.REALTIME_PRIORITY_CLASS)

  • 資深大佬 : IDAEngine

    用系统 API 不香吗? while sleep 不靠谱

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具