我正在尝试在python中创建一个高度模块化和数据驱动的程序,我希望模块之间的调用通过一个中央代理单例,而不是每个对象都持有对与之通信的对象的引用。主要原因是我不希望对象具有任何信息,以了解其他模块在运行时切换时的工作方式。
目前,这个代理服务只是一个单例,它有一个带有函数名的元组列表和对拥有它的对象的引用。每当模块遇到不属于自己方法的命令时,默认行为就是将其发送到此代理服务,该代理服务将检查是否有任何人在线能够执行它。如果找到某人,代理会将函数调用转发给正确的对象,然后在收到调用者后将其返回给调用者。
我遇到的问题是,每次我需要进行任何进程间通信时,我都会导致对象的上下文交换,最终会不必要地膨胀我的callstack。
那么我的问题是:
如何在python实现中处理这样的上下文更改?我可以做些什么来降低影响力 这种背景变化?
P.S。:名称代理可能有点误导,但这不是网络应用程序。整个过程只需一台机器就可以在一个进程中运行。
编辑:这里提到的是一个更具体的例子。
class forwardToProxy:
dict = {} #this dictionary would contain the names of commands such as "deleteName"
#and a first class function bound to the part of the program currently
#responsible for executing that command.
def forward_command(command, arg):
return dispatch[command](arg)
这是我对代理对象的意思的一个例子。这个类唯一做的是向当前分配给执行的程序部分转发命令。我的问题涉及使用这种结构的后果。
模块发出的每个调用是否会在内存中创建此类的新实例,直到它结算为止?
如果一个命令被转发到一个模块,那么结果会转发另一个命令,并导致另一个模块转发另一个命令,该对象的多少个实例将在内存中等待最终返回?
每次在不同的python实现中进行函数调用时,内存中究竟发生了什么?(请解释相同模块和外部模块调用)
可以使用哪些优化来减少此类上下文更改的影响(例如@staticmethod帮助)?
答案 0 :(得分:1)
有趣的话题。坦率地说,预计Python不会快速运行,但是,我观察到越来越多的需求。
功能范围是dict
,在这里看不出多少优化。
我知道在空间优化发挥作用时会使用named tuple。原因是,使用命名元组,所有键都相同,并保留一次。这样,您可以在代理定义中节省一些空间。但是,如果调用function,它会创建一个范围dict
。这就是Python的工作原理。如何优化呢?好吧,你必须在C中写一下,以便完全控制什么,何时分配。