【问题标题】:Thread specific data with webpy使用 webpy 线程特定数据
【发布时间】:2009-01-19 23:26:18
【问题描述】:

我正在用 webpy 编写一个小网络应用程序,我想知道是否有人对我遇到的一个小问题有任何信息。

我写了一个小的 ORM 系统,它似乎运行得很好。理想情况下,我想将它与 webpy 缝合,但似乎只是按原样使用它会导致线程问题(数据库连接是跨线程边界实例化/访问的,或者异常状态)。

有谁知道我如何(在 webpy 中)在与页面处理代码的其余部分相同的线程上创建我的数据库连接?

【问题讨论】:

  • 你用的是webpy内置的webserver吗?
  • 是的,我是/曾经是。我也将它用作 apache 模块,但厌倦了必须重新启动服务器(它重新加载的东西在附加到 apache 时并不总是有效。:()。

标签: python database multithreading web.py


【解决方案1】:

我们将 SQLAlchemy 与 web.py 一起使用,并使用钩子来创建和关闭每个请求的数据库连接。 SQLAlchemy 处理池,所以不是每个连接都是 tcp 连接。

您要使用的线程本地存储是 web.ctx 即。每次访问 web.ctx 时,您只会看到该线程设置的属性。

我们的代码如下所示:

def sa_load_hook():
    web.ctx.sadb = Session()

def sa_unload_hook():
    web.ctx.sadb.close()

web.loadhooks['sasession'] = sa_load_hook
web.unloadhooks['sasession'] = sa_unload_hook

将 Session 替换为您的数据库连接功能,它应该适合您。

【讨论】:

    【解决方案2】:

    我会试试这个。免责声明:我没有使用 web.py 框架的经验。

    我建议您尝试以下方法:

    (1) 创建一个全局 threading.local 实例来跟踪您的线程本地对象(在您的情况下,它将只跟踪一个对象,一个数据库会话)。

    import threading
    serving = threading.local()
    

    (2) 在每个请求开始时,创建一个数据库连接/会话并将其保存在 threading.local 实例中。如果我正确理解了web.py documentation,您可以执行以下操作:

    def setup_dbconnection(handler): 
        serving.dbconnection = create_dbconnection(...)
        try:
            return handler()
        finally:
            serving.dbconnection.close() # or similar
    
    app.add_processor(setup_dbconnection)
    

    (3) 在您的控制器方法中(如果它们在 web.py 中被调用?),每当您需要数据库连接时,请使用 serving.dbconnection。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多