【发布时间】: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