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()
11199 次点击
所在节点    Python
108 条回复
inframe
2020-10-16 20:08:47 +08:00
我真的在生产环境见过这样的代码,你们应该能够理解我当时的心情。

+1
ctro15547
2020-10-16 20:46:06 +08:00
延迟 0.1 秒就行 。。
E1n
2020-10-16 23:37:42 +08:00
哈哈加油
Yinz
2020-10-17 00:05:27 +08:00
不得不说,楼主心态蛮好的,加油,谁都有新手阶段,学习即可
by73
2020-10-17 00:11:30 +08:00
突然对 time.sleep 有了点兴趣,最后发现居然调用的是 select() 系统调用😂
irytu
2020-10-17 00:19:26 +08:00
os.sched_yield()

不过 Windows 上没有这种方法 我一般为了 portable 会写成 time.sleep(0.0001)
vcfghtyjc
2020-10-17 00:25:28 +08:00
运行时候检测一下当前时间,然后算出需要的睡眠时间,sleep 就行了
shijingshijing
2020-10-17 00:42:59 +08:00
sleep(0)没毛病,代码不改,在 crontab 里面设定 2020 年 10 月 17 日 10 点 50 分 50 秒执行一次就 ok 了。
discrete
2020-10-17 06:22:20 +08:00
想起了 Sleep Sort.
sudoy
2020-10-17 09:51:03 +08:00
@nuk 谢谢!请问具体怎么操作?
sudoy
2020-10-17 09:53:01 +08:00
@ma7x 这个问题问的好。当然是定时调用 API 啦,Windows 10 自带的闹钟并非可编程的
inorilzy
2020-10-17 10:03:30 +08:00
APScheduler 和 celery 都可以定时任务。
findlisa
2020-10-17 10:04:46 +08:00
@ruanimal 好的👌
raymanr
2020-10-17 13:08:19 +08:00
@sudoy 如果纯粹是为了定时的话, 就 windows 的任务计划就挺好, 而且足够可靠, 自己写会有很多坑
sudoy
2020-10-17 14:13:16 +08:00
@raymanr 谢谢
nuistzhou
2020-10-17 14:57:37 +08:00
为何我想起了大名鼎鼎的“睡眠排序法”?!
sudoy
2020-10-17 15:32:01 +08:00
@nuistzhou 就是那个从天而降的掌法吗?
adamwong
2020-10-17 15:52:36 +08:00
@SmartKeyerror 我怎么又抓到你了
nuk
2020-10-17 17:18:14 +08:00
@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
2020-10-17 18:48:11 +08:00
用系统 API 不香吗? while sleep 不靠谱

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

https://tanronggui.xyz/t/715524

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

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

© 2021 V2EX