Python 对每天为每个用户随机生成的日期时间执行函数
一个有趣的难题。以下是我想做的: 我有一个运行在Heroku上的金字塔(Python2.7.2)网站,它向我的iPhone应用程序用户推送通知。每天,每个用户都需要在上午10:00到晚上10:00之间随机生成的时间向他们发送推送通知(显然还需要知道用户的时区) 我目前的计划如下:使用一个持久的工作进程每1分钟触发一个函数。每分钟,它将调用一个函数(在不同的线程上,以避免中断计时器),该函数将执行两项操作: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,它将调用一个
我的问题是:有没有更好的方法可以做到这一点,而不需要每天事先生成大量随机日期时间列表?下面是一些伪代码:
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的通知。
我喜欢这样。除此之外,什么是检查他们是否收到通知的好方法?将这些信息放入数据库中。在您发送通知时以及在他们一天的开始时更新。。。嗯,这意味着毕竟每小时都会有一次大的更新。我想我更喜欢“当你发送一个更新时,安排下一个更新”的方案。