0

我想制作一个网页,每 10 秒生成一个 0 到 99 之间的统一随机数,并显示 100 个最新数字的列表(对于访问该网站的每个人来说都是相同的)。它应该实时更新。

我的设计如下:

  • 一个长时间运行的 Python 进程(例如使用 supervisord),它在一个永恒的循环中运行,以 10 秒的间隔生成数字,并将数字写入文件或 SQL 数据库,并修剪不再需要的旧数字。
  • 然后 Web 服务器进程简单地读取文件并显示给用户(在初始加载时,或者从 Ajax 调用中获取最新的数字)

我对这个解决方案感觉不太好。它在文件系统 I/O 上相当繁重,这并不是真正的瓶颈或任何东西,但我只是想知道是否有更聪明的方法仍然很简单。如果我可以将列表存储为进程之间共享的内存数据结构,我可以每 10 秒有一个进程推送和弹出值,然后 Web 服务器进程可以读取该数据结构。我读了一些关于 Unix 域套接字的内容,但不清楚这是否非常适合我的问题

有没有更有效但仍然简单的方法?

编辑:Martijn Peters 在他的回答中建议的方法(在有人访问之前不要生成任何东西)是明智的,我也在考虑它,因为该网站的访问量不是很大。我看到的问题是竞争条件,因为您有多个进程试图写入同一个文件/数据库。如果文件/数据库中的值是陈旧的,我们需要生成新的值,但是一个进程可能会在另一个进程有机会更新它们之前读取旧值。此问题中描述的文件锁定是一种可能性,但答案中的许多人警告说,有多个进程写入同一个文件。

4

2 回答 2

0

你把事情复杂化了。

在您有实际请求之前不要生成任何数字。然后看看你的最后一个数字有多老,生成足够的数字来覆盖中间的时间段,更新你的表格,返回结果。

这里实际上不需要每 10 秒生成一个随机数。您只需要产生每 10 秒生成一次数字的错觉,这足以满足您的用例。

一个好的数据库会为你处理并发访问,而且大多数还会让你设置排他锁。当您需要更新数字时,请抓住锁。没抢到锁?其他东西已经在更新这些数字。

预生成号码;没有什么说你实际上只需要为过去的时间段生成数字。随机化预先生成的请求以最大程度地减少锁争用。将数字附加到池的末尾,这样如果你不小心运行了两次,你得到的只是额外的随机数的两倍,所以你可以在需要生成更多之前等待两倍的时间。

最重要的是,生成随机数序列很便宜,因此在任何请求期间执行此操作几乎不会减慢您的响应速度。

于 2013-07-12T16:19:10.010 回答
0

我会预先生成很多数字(比如说,足够 1 周的数字;做数学)并存储它们。这样,Ajax 调用只会加载列表中的下一个数字。当您的数字用完时,再次预生成。生成和写入数据库的过程将只在一段时间内执行一次(例如每周一次)。

编辑:整整一周,您最多需要 60480 个号码。使用 Martijn Pieters 推荐的内容(仅在访客确实要求时读取新号码),并根据您的具体需求(因为即使没有人看到这些号码,您可能仍需要烧掉这些号码),这些号码可能会持续更多比一周。

于 2013-07-12T16:28:41.737 回答