Windows上的Python 3.5,请尝试以下操作:
import ssl, pickle, multiprocessing context = ssl.create_default_context() foo = pickle.dumps(context) pickle.loads(foo)
引发异常:
TypeError: __new__() missing 1 required positional argument: 'protocol'
multiprocessing.Process的子类抛出相同的异常:
class Foo(multiprocessing.Process): def __init__(self): super().__init__() self.context = ssl.create_default_context() def run(self): pass if __name__ == '__main__': foo = Foo() foo.start()
这样的事情应该起作用:
>>> import pickle, copyreg, ssl >>> >>> def save_sslcontext(obj): ... return obj.__class__, (obj.protocol,) ... >>> copyreg.pickle(ssl.SSLContext, save_sslcontext) >>> >>> context = ssl.create_default_context() >>> foo = pickle.dumps(context) >>> _foo = pickle.loads(foo) >>> _foo <ssl.SSLContext object at 0x1011812a8> >>> _foo.protocol 2 >>>
基本上,aSSLContext需要a protocol,并且由于任何原因,实例被腌制时protocol都不会保存(例如,不在__reduce__方法中)。如果您需要更多的状态(即其他args并kwds从__init__方法),那么你就需要从扩展的返回值save_sslcontext上述功能。(请注意,如果您使用的是python 2.x,则相应的模块为copy_reg)。
SSLContext
protocol
__reduce__
args
kwds
__init__
save_sslcontext
copy_reg