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
牛客网
sudoy
V2EX  ›  Python

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

  •  
  •   sudoy · 10 天前 · 6882 次点击

    我在做一个闹钟,等到谋个时间就开始执行谋个动作(在下面的案例里面简化为 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()
    
    第 1 条附言  ·  9 天前

    感谢大家的回复!根据大家的建议和帮助,我决定采用计算时间差然后用sleep的办法。其他办法比如用第三方库或者线程等方法也很好,但我希望尽量简单点。这个只需要精确到未来某个时间的秒即可。我更新代码如下,希望对其他新手有帮助:

    from time import sleep
    from datetime import datetime
    
    def alarm():
    	now = datetime.now().timestamp()
    	set_time = datetime(2020, 10, 16, 22, 42, 50).timestamp()
    	delta = set_time - now
    	sleep(delta)
    	print('ok')
    
    
    if __name__ == '__main__':
    	alarm()
    
    
    108 条回复    2020-10-19 11:38:53 +08:00
    1  2  
    neoblackcap
        101
    neoblackcap   9 天前   ❤️ 1
    @sudoy sleep 问题不大,因为底层就是这样干的。要求精度不是很高的时候,这样干没啥问题。不过定时器是一个比较敏感的问题,很多人考虑的问题的维度是不一样的。有些人是需要高精度的定时器,有些人是需要硬实时的定时器,有些是需要真实墙上时间的定时器。
    需求不一样,会产生的回答也不一样。认清楚自己的需求,写符合满足自己需求的程序就好了。很多人说用 XX 技术,其实你根本没有这个需要,为何要做更多无意义的事情呢?比如 timerfd + I/O multiplexing 。可以支持的精度很高,有意义么?
    自己去走一走才知道鞋子合不合穿,加油吧
    sudoy
        102
    sudoy   9 天前
    @neoblackcap 是的,讲的真好。能实现目的,然后尽量少占用资源就够了
    sudoy
        103
    sudoy   9 天前
    @nuk get 了,谢谢
    crella
        104
    crella   8 天前 via Android
    这给人感觉连 c 语言考试都没过的感觉,运行一下就发现 cpu 占用 100%啦
    以后不想看某些区了
    crella
        105
    crella   8 天前 via Android
    更正:是 cpu 单核占用 100%。

    某台洋垃圾的六核十二线程 cpu 用 wps 打开大文档卡死,一看:只吃单核。
    sudoy
        106
    sudoy   7 天前
    @crella 呀,不好意思,我以为这个区没考过 C 语言也可以发帖。感觉去找本 C 语言的书来看看,请问老哥有推荐的吗?
    crella
        107
    crella   7 天前 via Android
    @sudoy 对不起,是我表达过激了。这里大佬很多的,看 jvm 和手写编译器的水平。
    sudoy
        108
    sudoy   7 天前
    @crella 哈哈,没关系,我其实不是 IT 行业,自学编程属于业余爱好,还要多向你们请教
    1  2  
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3815 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 16ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    ♥ Do have faith in what you're doing.