在网页上显示连续的整数流
Posted
技术标签:
【中文标题】在网页上显示连续的整数流【英文标题】:Displaying a continuous stream of integers on a web page 【发布时间】:2013-07-12 16:16:44 【问题描述】:我想制作一个网页,它每 10 秒生成一个介于 0 和 99 之间的统一随机数,并显示最近 100 个数字的列表(对于访问该网站的每个人来说都是相同的)。它应该会实时更新。
我的设计如下:
一个长时间运行的 Python 进程(例如使用 supervisord),它在一个永久循环中运行,以 10 秒的间隔生成数字,并将数字写入文件或 SQL 数据库,并修剪旧数字,因为它们不再是需要。 然后,Web 服务器进程只需读取文件并显示给用户(在初始加载时,或从 Ajax 调用中获取最新数字)我对这个解决方案感觉不太好。它在文件系统 I/O 上相当繁重,这并不是真正的瓶颈或任何东西,但我只是想知道是否有更聪明的方法仍然很简单。如果我可以将列表存储为进程之间共享的内存数据结构,我可以每 10 秒有一个进程推送和弹出值,然后 Web 服务器进程可以读取该数据结构。我阅读了一些有关 Unix 域套接字的信息,但不清楚这是否非常适合我的问题
有没有更有效但仍然简单的方法?
编辑:Martijn Peters 在他的回答中建议的方法(在有人访问之前不要生成任何东西)是明智的,我也在考虑它,因为该网站的流量并不大。我看到的问题是竞争条件,因为你有多个进程试图写入同一个文件/数据库。如果文件/数据库中的值过时,我们需要生成新值,但一个进程可能会在另一个进程有机会更新它们之前读取旧值。 this question 中描述的文件锁定是可能的,但答案中的许多人警告说,有多个进程写入同一个文件。
【问题讨论】:
【参考方案1】:你把事情复杂化了。
在您有实际请求之前不要生成任何数字。然后查看您的最后一个数字的年龄,生成足够的数字以涵盖中间时间段,更新您的表格,返回结果。
这里没有实际需要实际上每 10 秒生成一个随机数。您只需要产生每 10 秒生成一次数字的错觉,这足以满足您的用例。
一个好的数据库会为你处理并发访问,而且大多数还会让你设置排他锁。当您需要更新数字时,请抓住锁。抢不到锁?其他东西已经在更新这些数字了。
预生成数字;没有什么说你实际上只需要为过去的时间段生成数字。随机化预先生成的请求以最大程度地减少锁争用。将数字附加到池的末尾,以便如果您不小心运行了两次,您得到的只是额外随机数的两倍,因此您可以等待两倍的时间才能生成更多。
最重要的是,生成随机数序列便宜,因此在任何请求期间执行此操作几乎不会减慢您的响应速度。
【讨论】:
更新必须实时完成,通过 Ajax 更新。他确实需要每 10 秒生成一个数字。 那么AJAX调用就可以触发更新了。在您有一个实际访问者的页面驱动 AJAX 调用之前,生成数字是没有意义的。 你说得对。然而,关键点仍然存在:如果只连接了一个访问者,则会每 10 秒运行一个进程来生成数字。 关于我上一条评论的注释:然而,这种方法比拥有一个不断运行的流程更好。虽然您不节省数据库负载,但确实节省了 CPU。 谢谢 Martijn。我想要独占锁。用户 2 应该等待用户 1 的进程正在更新数据库。在释放锁之前我没有找到阻塞的方法,所以我想我可以将 DB 代码放在一个 while 循环中,直到它能够获得锁为止。【参考方案2】:我会预先生成很多数字(例如,足够 1 周的数字;做数学运算)并存储它们。这样,Ajax 调用只会加载列表中的下一个数字。当您的数字用完时,再次预生成。生成和写入数据库的过程只会在一段时间内执行一次(例如每周一次)。
编辑:整整一周,您最多需要 60480 个号码。使用 Martijn Pieters 推荐的内容(仅在访客确实要求时读取新号码),并根据您的具体需求(因为即使没有人看到这些号码,您可能仍需要烧掉这些号码),这些号码可能会持续更多比一周。
【讨论】:
以上是关于在网页上显示连续的整数流的主要内容,如果未能解决你的问题,请参考以下文章
2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接