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 · 2020-10-16 10:57:13 +08:00 · 11090 次点击
    这是一个创建于 1524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在做一个闹钟,等到谋个时间就开始执行谋个动作(在下面的案例里面简化为 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 条附言  ·  2020-10-17 10:49:52 +08:00

    感谢大家的回复!根据大家的建议和帮助,我决定采用计算时间差然后用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  
       2020-10-17 20:03:17 +08:00   ❤️ 1
    @sudoy sleep 问题不大,因为底层就是这样干的。要求精度不是很高的时候,这样干没啥问题。不过定时器是一个比较敏感的问题,很多人考虑的问题的维度是不一样的。有些人是需要高精度的定时器,有些人是需要硬实时的定时器,有些是需要真实墙上时间的定时器。
    需求不一样,会产生的回答也不一样。认清楚自己的需求,写符合满足自己需求的程序就好了。很多人说用 XX 技术,其实你根本没有这个需要,为何要做更多无意义的事情呢?比如 timerfd + I/O multiplexing 。可以支持的精度很高,有意义么?
    自己去走一走才知道鞋子合不合穿,加油吧
    sudoy
        102
    sudoy  
    OP
       2020-10-17 20:58:18 +08:00
    @neoblackcap 是的,讲的真好。能实现目的,然后尽量少占用资源就够了
    sudoy
        103
    sudoy  
    OP
       2020-10-17 21:06:00 +08:00
    @nuk get 了,谢谢
    crella
        104
    crella  
       2020-10-18 20:47:37 +08:00 via Android
    这给人感觉连 c 语言考试都没过的感觉,运行一下就发现 cpu 占用 100%啦
    以后不想看某些区了
    crella
        105
    crella  
       2020-10-18 20:51:46 +08:00 via Android
    更正:是 cpu 单核占用 100%。

    某台洋垃圾的六核十二线程 cpu 用 wps 打开大文档卡死,一看:只吃单核。
    sudoy
        106
    sudoy  
    OP
       2020-10-19 09:47:08 +08:00
    @crella 呀,不好意思,我以为这个区没考过 C 语言也可以发帖。感觉去找本 C 语言的书来看看,请问老哥有推荐的吗?
    crella
        107
    crella  
       2020-10-19 10:36:50 +08:00 via Android
    @sudoy 对不起,是我表达过激了。这里大佬很多的,看 jvm 和手写编译器的水平。
    sudoy
        108
    sudoy  
    OP
       2020-10-19 11:38:53 +08:00
    @crella 哈哈,没关系,我其实不是 IT 行业,自学编程属于业余爱好,还要多向你们请教
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.