我正在尝试通过网络连接(使用asyncore)传输函数。有没有一种简单的方法可以序列化python函数(在这种情况下,至少不会有副作用)以便进行这样的传输?
理想情况下,我希望有两个类似的函数:
def transmit(func):
obj = pickle.dumps(func)
[send obj across the network]
def receive():
[receive obj from the network]
func = pickle.loads(s)
func()
Tags:
您可以序列化函数字节码,然后在调用者上重新构造它。可以使用marshal模块序列化代码对象,然后将其重新组合为函数。即:
然后在远程进程中(传输代码字符串后):
一些注意事项:
marshal的格式(这方面的任何python字节码)在主要python版本之间可能不兼容。
只对cpython实现有效。
如果函数引用需要获取的全局参数(包括导入的模块、其他函数等),则还需要序列化这些参数,或者在远程重新创建它们。我的示例只是给出了远程进程的全局命名空间。
您可能需要做更多的工作来支持更复杂的情况,比如闭包或生成器函数。
查看Dill,它扩展了Python的pickle库以支持更多类型,包括函数:
它还支持对函数闭包中对象的引用:
Pyro能够do this for you。
相关问题 更多 >
编程相关推荐