V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
douglas1997
V2EX  ›  问与答

想实现一个简单的 Python 提醒喝水的算法

  •  1
     
  •   douglas1997 · 2019-04-18 23:57:43 +08:00 · 1894 次点击
    这是一个创建于 1828 天前的主题,其中的信息可能已经有所发展或是发生改变。

    设想:

    1. 每天有 8 个在( 8 ~ 22 点)的随机时间点分布在这个时间段不同的小时,e.g. [9, 11, 13, 14, 16, 18, 19, 20]
    2. 然后在这些时间点发送提醒消息
    

    大家觉得怎么实现高效呢?我觉得如果先生成这 8 个时间点,再用一个 while 不断的阻塞 sleep&check 所有时间点很 naive,并且每天都要重复生成也很蠢。如何判断新的一天到来也是一个问题。

    emmm,对这种算法不是很熟。求指教~

    第 1 条附言  ·  2019-04-19 02:03:56 +08:00


    我写的 Python3 blocking 版本,尽量降低 datetime.now()的调用次数,删除了部分我的私人化代码。

    Good night ~
    14 条回复    2020-09-01 16:40:58 +08:00
    douglas1997
        1
    douglas1997  
    OP
       2019-04-19 00:08:54 +08:00
    大佬都睡了吗 :(
    pual
        2
    pual  
       2019-04-19 00:41:23 +08:00 via Android
    操作系统有时钟的 API, 注册时间断并监听
    nodwang
        3
    nodwang  
       2019-04-19 00:44:17 +08:00 via Android
    我自己用 go 写了一个,就是你说的 naive 版本,
    流程是:
    1,开机启动,初始化 40 天查询是否工作日,存到 sqlite。

    2,初始化一次当天和第 40+天,检查当天是否工作日,非工作日 sleep 1 小时,直到当天结束。

    3,工作日:sleep 30 分钟 & check 时间是否在 9-12,13-18 之内 ,如果是 提醒 然后 sleep。

    4,goto 2。

    上面数字 30,40,9,12,13,18 都是启动时 flag 参数控制 ,初始化时顺便 抓了 bing 每日壁纸,windows 锁屏壁纸,新手 go 练手美滋滋
    douglas1997
        4
    douglas1997  
    OP
       2019-04-19 00:57:52 +08:00
    @pual 嗯看来还是一个离不开系统中断的程序。

    @nodwang naive 版本好写一些。如果没有比较好的回复的话我就 Append 供其他人参考吧。
    nanaw
        5
    nanaw  
       2019-04-19 00:59:06 +08:00 via Android
    每 2 小时无需获取时间:
    x=y=0
    while 1:
    x=y;y=randint(1,60);sleep(60*60*2-120*x+120*y)
    #action

    定时任务 每天 7 点执行
    分布不均匀的话再加 if
    zouchtssn
        6
    zouchtssn  
       2019-04-19 01:01:01 +08:00
    at
    xujunfu
        7
    xujunfu  
       2019-04-19 01:04:15 +08:00 via Android
    你需要的是闹钟,把精力和思考用在刀刃上吧
    douglas1997
        8
    douglas1997  
    OP
       2019-04-19 01:16:09 +08:00
    @xujunfu 哈哈哈,是写给女票用的。每天微信提醒她喝水。
    douglas1997
        9
    douglas1997  
    OP
       2019-04-19 01:17:56 +08:00
    @nanaw 嗯,看来这种任务还是阻塞式的简单,我现在在写一个把每次阻塞时间拉到尽量最长的程序。
    douglas1997
        10
    douglas1997  
    OP
       2019-04-19 01:39:40 +08:00
    @zouchtssn 不用系统的,因为是随机的。
    geelaw
        11
    geelaw  
       2019-04-19 06:02:50 +08:00 via iPhone
    用 Windows Task Scheduler 就行,自带随机延迟,你只需要写一个发送提醒的程序。
    tcpdump
        12
    tcpdump  
       2019-04-19 09:46:49 +08:00
    喝水都需要提醒?
    c4f36e5766583218
        13
    c4f36e5766583218  
       2019-04-19 10:50:13 +08:00
    多喝热水🌺🐔
    AllenHua
        14
    AllenHua  
       2020-09-01 16:40:58 +08:00
    最近刚好关注到这方面 哈哈哈

    看到 12l 的 喝水都要提醒 瞬间笑了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2956 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:08 · PVG 11:08 · LAX 20:08 · JFK 23:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.