我有以下设置:
a.py
:
class A(object):
def __init__(self, name):
self.name = name
def a(self):
print('yow {}!'.format(self.name))
b.py
:
sender.py
:
from a import A
from b import B
message = pickle.dumps(B(A('Martin')))
receiver.py
:
my_b = pickle.loads(message)
my_a = my_b.obj
my_a.a()
输出:yow Martin!
在sender.py
中,我pickle对象b
,它充当对象a
的载体。然后我通过RabbitMQ将pickled对象b
发送到另一个进程。在receiver.py
(这是另一个进程)中,我通过RabbitMQ、unpickle objectb
和{receiver.py
尽可能少地消耗内存。但是如果模块没有我的控制就被导入,它会很快膨胀。在
有人能解释一下泡菜是怎么进口的吗?在
它使用
A
和B
的__module__
属性:如果您想控制导入的内容,可以构造python包,这样
from a import A
不会加载太多对象。在需要什么样的控制?从源代码中可以看到,当您运行
pickle.loads(content)
时,它实际上是:还有一些魔力。它将字符串作为文件读取,并根据特定的键发送其内容:
^{pr2}$加载函数本身:
{{cd2>中使用的是{cd3>
例如,
load_inst()
函数:因此,如果您想控制可以导入的名称空间或模块,则需要子类}以满足您的目标。我的回答对你有帮助吗?在
Unpickler
并重写{pickle
需要导入模块a
和{A
和{您不需要理解所有这些,但是请注意}然后是{}在那里。它告诉
bbbb
后跟B
,以及{pickle
如何重建pickled对象。为了加载类,它必须导入在其中定义类的模块。如果你试图搞乱pickle的机器并阻止加载模块,那么就没有办法重建对象了。在相关问题 更多 >
编程相关推荐