Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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_Database_Web_Concurrency_Ipc - Fatal编程技术网

Python 在网页上显示连续的整数流

Python 在网页上显示连续的整数流,python,database,web,concurrency,ipc,Python,Database,Web,Concurrency,Ipc,我想制作一个网页,每10秒生成一个0到99之间的统一随机数,并显示100个最新数字的列表(对于访问该网站的每个人都是相同的)。它应该实时更新 我的设计如下: 一个长期运行的Python进程(例如,使用supervisord),在一个永恒的循环中运行,以10秒的间隔生成数字,并将数字写入文件或SQL数据库,并删除旧的数字,因为它们不再需要 然后,web服务器进程只需读取文件并向用户显示(在初始加载时,或者通过Ajax调用获取最新的数字) 我对这个解决方案感觉不太好。它对文件系统I/O的要求相当

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

我的设计如下:

  • 一个长期运行的Python进程(例如,使用supervisord),在一个永恒的循环中运行,以10秒的间隔生成数字,并将数字写入文件或SQL数据库,并删除旧的数字,因为它们不再需要
  • 然后,web服务器进程只需读取文件并向用户显示(在初始加载时,或者通过Ajax调用获取最新的数字)
我对这个解决方案感觉不太好。它对文件系统I/O的要求相当高,这并不是真正的瓶颈或其他问题,但我只是想知道是否有一种更智能的方法仍然很简单。如果我可以将列表存储为进程之间共享的内存中的数据结构,那么每10秒就有一个进程push和pop值,然后web服务器进程就可以读取该数据结构。我读了一些关于Unix域套接字的文章,但不清楚这是否适合我的问题

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


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

您的操作过于复杂

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

实际上,没有必要每10秒生成一个随机数。您只需要产生每10秒生成一次数字的错觉,这对于您的用例来说已经足够了

一个好的数据库将为您处理并发访问,并且大多数数据库还允许您设置独占锁。当你需要更新数字时,抓住锁。没有抓住锁?其他一些东西已经在更新这些数字了

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


最重要的是,生成一系列随机数很便宜,因此在任何请求期间这样做都不会降低您的响应速度。

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


编辑:整整一周,你最多需要60480个数字。使用Martijn Pieters建议的方法(只有当访问者确实要求一个新号码时才阅读),并根据您的具体需要(因为即使没有人看到这些号码,您也可能需要刻录这些号码),这些号码可能会持续一周以上。

必须通过Ajax实时更新。他确实需要每10秒生成一个数字,然后AJAX调用可以触发更新。除非你有一个真正的访问者拥有一个驱动AJAX调用的页面,否则生成数字是没有意义的。你是对的。然而,关键点仍然是:如果只连接了一个访问者,那么每10秒将运行一个进程来生成数字。我最后一条评论中有一条注释:然而,这种方法比有一个不断运行的进程要好。虽然不保存数据库负载,但确实节省了CPU。谢谢Martijn。我想要专用锁。当用户1的进程正在更新数据库时,用户2应该等待。在锁被释放之前,我没有找到阻止的方法,所以我想我可以将DB代码放在一个while循环中,该循环运行直到它能够获得锁为止。