Python 在网页上显示连续的整数流
我想制作一个网页,每10秒生成一个0到99之间的统一随机数,并显示100个最新数字的列表(对于访问该网站的每个人都是相同的)。它应该实时更新 我的设计如下:Python 在网页上显示连续的整数流,python,database,web,concurrency,ipc,Python,Database,Web,Concurrency,Ipc,我想制作一个网页,每10秒生成一个0到99之间的统一随机数,并显示100个最新数字的列表(对于访问该网站的每个人都是相同的)。它应该实时更新 我的设计如下: 一个长期运行的Python进程(例如,使用supervisord),在一个永恒的循环中运行,以10秒的间隔生成数字,并将数字写入文件或SQL数据库,并删除旧的数字,因为它们不再需要 然后,web服务器进程只需读取文件并向用户显示(在初始加载时,或者通过Ajax调用获取最新的数字) 我对这个解决方案感觉不太好。它对文件系统I/O的要求相当
- 一个长期运行的Python进程(例如,使用supervisord),在一个永恒的循环中运行,以10秒的间隔生成数字,并将数字写入文件或SQL数据库,并删除旧的数字,因为它们不再需要
- 然后,web服务器进程只需读取文件并向用户显示(在初始加载时,或者通过Ajax调用获取最新的数字)
编辑:Martijn Peters在他的回答中建议的方法(在有人访问之前不要生成任何内容)是明智的,我也在考虑,因为该网站的流量不是很高。我看到的问题是竞争条件,因为您有多个进程试图写入同一个文件/DB。如果/DB文件中的值过时,我们需要生成新值,但是一个进程可能会在另一个进程有机会更新旧值之前读取旧值。如中所述的文件锁定是可能的,但答案中的许多人警告说,多个进程将写入同一个文件。您的操作过于复杂 在收到实际请求之前,不要生成任何数字。然后看看你的最后一个数字有多大,生成足够的数字覆盖中间的时间段,更新表格,返回结果 实际上,没有必要每10秒生成一个随机数。您只需要产生每10秒生成一次数字的错觉,这对于您的用例来说已经足够了 一个好的数据库将为您处理并发访问,并且大多数数据库还允许您设置独占锁。当你需要更新数字时,抓住锁。没有抓住锁?其他一些东西已经在更新这些数字了 预生成数字;没有什么说你实际上只需要为过去的时间段生成数字。随机化预生成的请求以最小化锁争用。将这些数字附加到池的末尾,这样,如果您意外地运行了两次,您得到的只是额外随机数的两倍,因此您可以在需要生成更多随机数之前等待两倍的时间
最重要的是,生成一系列随机数很便宜,因此在任何请求期间这样做都不会降低您的响应速度。我会预先生成大量数字(比如,足够一周的数字;做数学运算)并存储它们。这样,Ajax调用将只加载列表中的下一个数字。当数字用完时,请再次预生成。生成和写入DB的过程在一段时间内只执行一次(例如,每周执行一次)
编辑:整整一周,你最多需要60480个数字。使用Martijn Pieters建议的方法(只有当访问者确实要求一个新号码时才阅读),并根据您的具体需要(因为即使没有人看到这些号码,您也可能需要刻录这些号码),这些号码可能会持续一周以上。必须通过Ajax实时更新。他确实需要每10秒生成一个数字,然后AJAX调用可以触发更新。除非你有一个真正的访问者拥有一个驱动AJAX调用的页面,否则生成数字是没有意义的。你是对的。然而,关键点仍然是:如果只连接了一个访问者,那么每10秒将运行一个进程来生成数字。我最后一条评论中有一条注释:然而,这种方法比有一个不断运行的进程要好。虽然不保存数据库负载,但确实节省了CPU。谢谢Martijn。我想要专用锁。当用户1的进程正在更新数据库时,用户2应该等待。在锁被释放之前,我没有找到阻止的方法,所以我想我可以将DB代码放在一个while循环中,该循环运行直到它能够获得锁为止。