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()
11191 次点击
所在节点    Python
108 条回复
xionger
2020-10-16 16:45:36 +08:00
哈哈 劝改行
ruanimal
2020-10-16 16:51:21 +08:00
@findlisa 每时每刻都在判断时间是否相等,也就是 cpu 一直是忙碌的状态,自然就会占满一个核心。如果有 sleep,cpu 在你程序 sleep 的期间就干别的,或者休息去了。

ps: 去看看操作系统的书,看看进程的调度。
GoLand
2020-10-16 16:52:47 +08:00
淦,这么精妙的代码我怎么想不到。
shuax
2020-10-16 16:54:46 +08:00
哎哟,我错了,sleep 0 确实不行,起码得 0.001
kiracyan
2020-10-16 16:58:28 +08:00
硬是要这么做建议你 sleep 个 300 秒 然后判断一下当前时间距离设定时间是不是小于 300 秒 再 sleep 1 秒
shenqi
2020-10-16 17:04:06 +08:00
。。。明显的实习生写的代码。

(又不是不能用.jpg )
Hxu2M811KVSJqN75
2020-10-16 17:06:43 +08:00
这个算今日最佳 [欢乐贴] 么?
jimmyismagic
2020-10-16 17:12:19 +08:00
评论里说实习生写的代码的,自己可以写一个出来试试,看能做到多高的精度,要做到等于而不是大于等于
caiji11
2020-10-16 17:16:01 +08:00
@xionger 头像可爱 大熊 这个哪里不太好
sapocaly
2020-10-16 17:21:45 +08:00
1.https://docs.python.org/3.7/library/sched.html
2.就是想写代码:用 sleep 或用 os api
3.用现有 pkg
iSecret
2020-10-16 17:36:17 +08:00
用 crontab 执行任务的话没这么多蛋疼的事还可以顺道解决了可能需要重复执行的问题,非要用 py 建议 sleep(执行时间 - 当前时间)。
tabris17
2020-10-16 17:42:57 +08:00
实现了一个野生 spinning
lane1
2020-10-16 17:53:00 +08:00
用术语来说, 你的写法是 spinlock, busy-waiting, CPU-bound... 不过话说计时器到底如何实现呢?
Tonni
2020-10-16 17:58:12 +08:00
哈哈,别的不说,楼主头像的狗子好可爱🐶
UN2758
2020-10-16 18:31:52 +08:00
lz 这么狂野的写法,怀念当年的我,哈哈哈哈
JCZ2MkKb5S8ZX9pq
2020-10-16 18:43:57 +08:00
直接算 timestamp 的时间差,sleep 一次到底不就好了。
这个格式化时间的操作有点多余,重复计算没必要啊。
wuwukai007
2020-10-16 18:52:31 +08:00
直接计算时间差,sleep,每次激活的时候重新计算,
lysS
2020-10-16 18:56:57 +08:00
想到见过 JS 延时函数:
        function sleepSync(ms) {
            var curr = new Date().getTime();
            ms += curr;
            while (curr < ms) {
                curr = new Date().getTime();
            }
        }
CSM
2020-10-16 19:10:16 +08:00
直接一觉睡到目标时间,醒来后完成任务就行,循环也不用
echoick
2020-10-16 19:17:21 +08:00
哈哈哈哈 sleep(0)

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

https://tanronggui.xyz/t/715524

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

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

© 2021 V2EX