【问题标题】:How to make read-only data accessible by diff requests while the server is running (apache, mod_python)如何在服务器运行时通过 diff 请求访问只读数据(apache、mod_python)
【发布时间】:2009-12-24 07:03:21
【问题描述】:

我正在使用 Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2,我想预加载我使用的数据。

目前我每次收到请求时都会从磁盘上的文件中读取数据,然后对其进行解析并将其存储在一个对象中。数据文件比较大,我想提前解析/预加载。

我在想我可以 1)在 apache 启动时将数据加载到内存中(服务器运行时大约 100MB 到 500MB 的数据将驻留在内存中),或者我可以 2)在提交第一个数据请求时加载它并将其保存在内存中,直到我关闭服务器。

下面是第二个想法的模型:

from mod_python import apache
from mod_python import Session

gvar = 0

def handler(req):
    req.content_type = 'text/plain'

    session = Session.Session(req)
    if session.is_new():
        global gvar
        req.write('gvar was originally : '+str(gvar))
        gvar = 314
        session['addr'] = req.connection.remote_ip
        session.save()
        req.write('\ngvar was just set to: '+str(gvar))
    else:
        global gvar
        req.write('gvar set to: '+str(gvar))

    return apache.OK  

输出(第一节):
gvar 最初是:0
gvar 刚刚设置为:314

输出(会话 > 1):
gvar 设置为:314

请分享您的 cmets 和解决方案, 谢谢

【问题讨论】:

  • 看看 Python 中的惰性实例化:en.wikipedia.org/wiki/Lazy_initialization#Python
  • 您的问题是关于惰性初始化的编程模式,还是预缓存大块数据的机制,或两者兼而有之?
  • 您可能希望在 Python 中使用单例模式进行多线程惰性实例化 en.wikipedia.org/wiki/Singleton_pattern#Python 不同的请求是否作为单独的线程运行?
  • 我确实需要一个好的预缓存机制,而惰性初始化是一个很好的模式,但具体来说,我需要一种方法来存储缓存的 obj,以便跨 diff 会话的多个请求可以访问它。
  • 会话是否等同于线程?

标签: python apache mod-python


【解决方案1】:

您可以使用数据设置 tmpfs(或 ramfs)挂载,它将保留在 RAM 中(tmpfs 可能会将数据发送到交换)。

【讨论】:

    【解决方案2】:

    你没有说你的数据是什么形式的,但如果一个密钥库就足够了,那么你可以使用搁置和操作系统缓存,以便以预解析的格式保存数据。

    【讨论】:

    • 我想避免序列化,因为当我从磁盘读取数据时(有很多与数据 obj 相关的元信息),它并没有节省我很多时间。您能否也澄清一下“连同操作系统缓存”是什么意思?
    • shelve 使用存储在磁盘上的密钥库,因此操作系统将相关部分保存在磁盘缓存中。
    • 我以后会记住这一点,但我宁愿不要为这个项目多次做磁盘 IO,因为不能保证 obj 会被缓存,对吧?
    【解决方案3】:

    另一种选择是使用posix_ipc 将数据保存在共享内存中,可供所有进程使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2019-04-09
      • 2011-08-13
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多