我正在尝试通过网络连接传输功能(使用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()
Run Code Online (Sandbox Code Playgroud) 我@functools.lru_cache在Python 3.3中使用.我想将缓存保存到文件中,以便在重新启动程序时恢复它.我该怎么办?
编辑1可能的解决方案:我们需要挑选任何类型的可调用
问题酸洗__closure__:
_pickle.PicklingError: Can't pickle <class 'cell'>: attribute lookup builtins.cell failed
Run Code Online (Sandbox Code Playgroud)
如果我尝试在没有它的情况下恢复功能,我会得到:
TypeError: arg 5 (closure) must be tuple
Run Code Online (Sandbox Code Playgroud) 我正在使用旧线程发布新代码,试图解决同样的问题.什么构成安全的泡菜?这个?
sock.py
from socket import socket
from socket import AF_INET
from socket import SOCK_STREAM
from socket import gethostbyname
from socket import gethostname
class SocketServer:
def __init__(self, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.port = port
def listen(self, data):
self.sock.bind(("127.0.0.1", self.port))
self.sock.listen(len(data))
while data:
s = self.sock.accept()[0]
siz, dat = data.pop()
s.send(siz)
s.send(dat)
s.close()
class Socket:
def __init__(self, host, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.connect((host, port))
def recv(self, size):
return self.sock.recv(size)
Run Code Online (Sandbox Code Playgroud)
pack.py
#http://stackoverflow.com/questions/6234586/we-need-to-pickle-any-sort-of-callable
from marshal import dumps as marshal_dumps
from pickle …Run Code Online (Sandbox Code Playgroud) 我已经多次研究过这个问题,但是没有找到一个可以在我的情况下工作的解决方法,或者我理解的解决方法,所以请耐心等待.
基本上,我有一个功能的层次组织,这阻止我在顶层进行多处理.不幸的是,我不相信我可以改变程序的布局 - 因为我需要在初始输入后创建的所有变量.
例如,说我有这个:
import multiprocessing
def calculate(x):
# here is where I would take this input x (and maybe a couple more inputs)
# and build a larger library of variables that I use further down the line
def domath(y):
return x * y
pool = multiprocessing.Pool(3)
final= pool.map(domath, range(3))
calculate(2)
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我在考虑全局,但我担心我必须定义太多,这可能会使我的程序减慢很多.是否有任何解决方法而无需重组整个计划?
这些模块旨在促进跨多台计算机的计算能力层.有哪些一种或多种经过验证的方法可以防止欺骗性数据包?如何最好地对传输的可调用引用的任何未包含的对象进行深层复制?函数对象是封装客户端作业的最佳方法吗?最后:这段代码可以改进吗?邮件脚本:请原谅我的最后一个问题.我需要兑现我的声誉.
sock.py
from socket import socket
from socket import AF_INET
from socket import SOCK_STREAM
from socket import gethostbyname
from socket import gethostname
class SocketServer:
def __init__(self, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.port = port
def send(self, tdata):
self.sock.bind(("127.0.0.1", self.port))
self.sock.listen(len(tdata))
while tdata:
s = self.sock.accept()[0]
for x in tdata.pop(): s.send(x)
s.close()
self.sock.close()
class Socket:
def __init__(self, host, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.connect((host, port))
def recv(self, size):
return self.sock.recv(size)
def close(self):
self.sock.close()
Run Code Online (Sandbox Code Playgroud)
pack.py
#http://stackoverflow.com/questions/6234586/we-need-to-pickle-any-sort-of-callable
from marshal import dumps as marshal_dumps …Run Code Online (Sandbox Code Playgroud)