Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对每天为每个用户随机生成的日期时间执行函数_Python_Ios_Datetime_Heroku_Scheduled Tasks - Fatal编程技术网

Python 对每天为每个用户随机生成的日期时间执行函数

Python 对每天为每个用户随机生成的日期时间执行函数,python,ios,datetime,heroku,scheduled-tasks,Python,Ios,Datetime,Heroku,Scheduled Tasks,一个有趣的难题。以下是我想做的: 我有一个运行在Heroku上的金字塔(Python2.7.2)网站,它向我的iPhone应用程序用户推送通知。每天,每个用户都需要在上午10:00到晚上10:00之间随机生成的时间向他们发送推送通知(显然还需要知道用户的时区) 我目前的计划如下:使用一个持久的工作进程每1分钟触发一个函数。每分钟,它将调用一个函数(在不同的线程上,以避免中断计时器),该函数将执行两项操作: 检查每个时区是否为晚上11:00(每天24次,每个时区一次)。如果为true,它将调用一个

一个有趣的难题。以下是我想做的:

我有一个运行在Heroku上的金字塔(Python2.7.2)网站,它向我的iPhone应用程序用户推送通知。每天,每个用户都需要在上午10:00到晚上10:00之间随机生成的时间向他们发送推送通知(显然还需要知道用户的时区)

我目前的计划如下:使用一个持久的工作进程每1分钟触发一个函数。每分钟,它将调用一个函数(在不同的线程上,以避免中断计时器),该函数将执行两项操作:

  • 检查每个时区是否为晚上11:00(每天24次,每个时区一次)。如果为true,它将调用一个函数,该函数循环遍历该时区中的每个用户,并生成他们第二天的随机时间,然后将其存储在Mongo数据库中

  • 在每一分钟,工作人员还将循环检查用户,并检查他们的通知是否在该时间到期。如果到期,则发送通知


  • 我的问题是:有没有更好的方法可以做到这一点,而不需要每天事先生成大量随机日期时间列表?

    下面是一些伪代码:

    Once per PERIOD (e.g. 1 minute) in the RANGE:
        Let NOTECOUNT be the number of users needing notification
        Let FRACTION be the length of the RANGE divided by the PERIOD
        Notify FRACTION of users (either first N or randomly chosen)
        Update notified user records with the notification time
    
    At the end of each RANGE:
        Notify all users whose last notification time is at least 24 hours ago
    

    关于如何处理多个时区没有明确的规定;您可以简单地考虑每个受支持的时区需要上述进程的一个“实例”,并且每个时区中的用户列表将是每个实例中的候选列表。两个潜在问题是,用户可能会更改时区,而且时区很糟糕,因此某些时间可能会发生两次(例如,当DST更改时),因此您应该考虑这一点。

    当然还有其他方法。他们是否更好是另一回事。例如:假设在给定用户的一天结束之前还有n分钟,而他们还没有收到通知。然后立即向他们发送概率为1/n的通知。这样,您就不需要庞大的随机日期时间列表,但每分钟您都需要迭代所有用户,查看他们是否收到通知,并计算所有用户的随机数。总的来说,计算量要多一点(尽管我怀疑差异是否显著),这意味着所有的数据库更新都很小

    或者:每次通知用户时,都会生成他们的下一次更新时间。这样,下一次更新的时间将以增量方式计算,但仍然可以提前知道


    (如果您的用户数量相对较少,因此在大多数情况下都没有通知,那么您可以使调度更加智能——但我不会对此多说,因为如果您的用户数量如此之少,那么您的软件需要做的工作量将是微不足道的,并且在这种情况下进行优化是没有意义的。)

    从每个用户的角度来看,时间看起来是随机的,这很重要吗?还是每天下午4点向Alice发送电子邮件,每天下午5点向Bob发送电子邮件,只要用户分散在一天中就可以了?时间需要对每个用户每天都是随机的,所以不应该重复。它必须是随机的,而且看起来也是随机的。我考虑过使用一小部分用户……但我的数学技能不太好,我担心用户会因为除数和余数不均匀而漏掉。这是一个问题吗?你能多说一点关于双时区DST的问题吗?当DST转换时,一年一次你“跳过”一个小时,一年一次你“重做”一个小时。我不确定你的情况会不会有问题,因为你工作的粒度(一天)比一小时大得多,但你应该记住这一点。
    例如:假设在给定用户的一天结束之前还有n分钟,他们还没有收到通知。然后立即向他们发送概率为1/n的通知。
    我喜欢这样。除此之外,什么是检查他们是否收到通知的好方法?将这些信息放入数据库中。在您发送通知时以及在他们一天的开始时更新。。。嗯,这意味着毕竟每小时都会有一次大的更新。我想我更喜欢“当你发送一个更新时,安排下一个更新”的方案。