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

2020-10-16 10:57:13 +08:00
 sudoy

我在做一个闹钟,等到谋个时间就开始执行谋个动作(在下面的案例里面简化为 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()
10672 次点击
所在节点    Python
108 条回复
fuchunliu
2020-10-16 15:29:58 +08:00
你是对的,他要听他们的,不然别人说你跑的假程序,CPU 都没占用
ysc3839
2020-10-16 15:37:40 +08:00
@est Windows 有 SetThreadpoolTimer,这个可以设置绝对时间,不受睡眠影响,还可以设置允许系统推迟执行,相比 sleep 更加省电。
winglight2016
2020-10-16 15:38:58 +08:00
@heyjei 这样的生产环境还能有任何“生产”吗?🐶
Bijiabo
2020-10-16 15:40:28 +08:00
看到 sleep(0) 笑死我了哈哈哈
lazyfighter
2020-10-16 15:40:29 +08:00
既然 sleep,为什么不算一下 sleep 多长时间呢
ThisQ
2020-10-16 15:41:06 +08:00
用系统定时任务调用脚本执行呢?
ysc3839
2020-10-16 15:45:23 +08:00
@wusheng0 我一般会选择用新线程来后台执行,fork 在某些操作系统上有坑,比如 Windows 没有 fork,macOS fork 之后不 exec 没法使用 CoreFoundation 。用线程的话可以共享资源,也没有那么多坑。
zgzb
2020-10-16 15:47:19 +08:00
我选择 after
nine9
2020-10-16 15:50:45 +08:00
可以考虑 threading.Event()

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

也就是 APScheduler 这个库实现使用的
est
2020-10-16 15:54:53 +08:00
@ysc3839 这个就是 OS 帮你做了很多脏活。。。
0bit
2020-10-16 16:01:03 +08:00
sleep 的问题已经很多人说了,我提一下关于时间比对的问题吧。
现在这样用 str 比对,容易有小坑,还是应该用更本质的数据去比对,比如 unix timestamp,更不容易出错。
nuk
2020-10-16 16:22:49 +08:00
最好调整成实时优先级,不然这一秒容易被跳过
findlisa
2020-10-16 16:23:47 +08:00
@ruanimal 为啥,一个循环就能把 cpu 占满吗
DoctorCat
2020-10-16 16:33:38 +08:00
兼容 posix 标准的系统还可以利用系统信号:signal 、setitimer 定时器交给 OS 去做了
ma7x
2020-10-16 16:34:24 +08:00
win10 自带闹钟超级好用 为什么要造轮子
www5070504
2020-10-16 16:34:50 +08:00
你这种写法 每天多费半度电吧 加个 timer 之类的 sleep 都行啊
SmartKeyerror
2020-10-16 16:34:56 +08:00
单线程直接用信号不就好了,向内核注册一个定时器,定时器到期后向进程发送 SIGALRM 信号。
darknoll
2020-10-16 16:37:27 +08:00
传说中的忙等待自旋锁?
fish267
2020-10-16 16:40:03 +08:00
还是 crontab 吧
muzuiget
2020-10-16 16:43:57 +08:00
哈哈,我也想到传说中的自旋锁。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX