【问题标题】:Monkey patching with subclass用子类修补猴子
【发布时间】:2016-10-30 10:30:27
【问题描述】:

Context:cherrypy session 当前在请求开始时锁定并在请求结束时释放锁定。因此并发请求被串行处理并被阻塞。

是否可以扩展一个类,覆盖一些新方法调用父方法的方法,然后猴子修补结果?

例子:

from cherrypy.lib import sessions
class LockingSession(sessions.RamSession):
    def get(self, *args, **kwargs):
        # acquire lock
        super(LockingSession).get(*args, **kwargs)
        # release lock
sessions.RamSession = LockingSession

该示例不起作用 - 无限循环 :-)

这是正确的方法吗?这有可能吗?如果是,怎么做?

【问题讨论】:

  • 我不确定猴子补丁,但我会尝试将你的类注入sessions 模块而不是替换现有的,然后在配置中启用它。看看这一行github.com/cherrypy/cherrypy/blob/master/cherrypy/lib/… 他们选择在配置中按名称在模块中声明的类。您可能应该使用它。
  • 这是一个带有redis后端的自定义会话类的例子:bitbucket.org/webknjaz/blueberrypy-wk/src/…bitbucket.org/webknjaz/blueberrypy-wk/src/…
  • 不知道 Mokey 补丁 :) 我知道它是面向方面的编程。也许这个帖子可以提供帮助:stackoverflow.com/questions/286958/…
  • 使用super()super(LockingSession, self) 我得到:>>> sessions.RamSession = LockingSession >>> t = sessions.RamSession() >>> t.get("A") [28/Jun/2016:10:33:54] ENGINE Started monitor thread 'Session cleanup'. 你得到什么错误?您不应该陷入无限循环,因为 self(LockingSession, []) 引用的是对象指针,而不是名称。
  • 哇。错过了那个错字...super(LockingSession, [...]) 引用了一个类描述符引用(在这种情况下是 super 类型的对象,但使用了对原始 type 对象的引用),而不是名称。

标签: python cherrypy monkeypatching


【解决方案1】:

UPD(2016 年 10 月 1 日):

pull request(于 2016 年 9 月 4 日合并,可用于CherryPy >= 8.1)引入了一种指定会话类的新方法。 像这样的东西应该可以满足您的需求:

import cherrypy

class Root:
    ...

class LockingSession(sessions.RamSession):
    def get(self, *args, **kwargs):
        # acquire lock
        super(LockingSession).get(*args, **kwargs)
        # release lock

conf = {
    ...,
    'tools.sessions.storage_class': LockingSession,
    ...,
}

cherrypy.quickstart(Root(), '/', conf)

旧答案:

以下应该可以工作:

from cherrypy.lib import sessions
class LockingSession(sessions.RamSession):
    def get(self, *args, **kwargs):
        # acquire lock
        super(LockingSession).get(*args, **kwargs)
        # release lock

sessions.LockingSession = LockingSession

【讨论】:

  • 在 python 2.7.6 或 3.4.3 中不正确。这是因为一旦在类的定义中指定了对象,就会使用对象引用,而不是名称,并且您不能用“=”覆盖该对象的引用。您在哪里测试了您的声明?
  • 不是我没有,我只是比较了工作代码和非工作代码 sn-ps 并提出了这些建议。
  • @Poik 看来你是对的。也许主题启动者遇到不同的问题
  • 要求澄清,但也许我有点冗长。另外,我似乎需要更多的咖啡。
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 2012-03-13
  • 2013-12-26
  • 2012-06-14
  • 2012-03-29
  • 2014-03-05
  • 2012-10-13
  • 2020-08-09
相关资源
最近更新 更多