我无法在进程之间发送管道对象。
pipe_i.send(diff_connection_object)
我知道连接对象是不可挑选的。由于 send() 仅将可选择的对象作为参数,因此我无法发送连接对象。那么我该怎么做呢?
如果您使用名为 multiprocess
的multiprocessing
分支,那么它应该适用于您要发送的几乎任何连接对象。 分支使用dill
而不是pickle
,以提供更好的序列化。 例如,下面是一个sqlite3.Connection
对象。
>>> import sqlite3
>>> c = sqlite3.connect(':memory:')
>>> c
<sqlite3.Connection object at 0x1046134b8>
>>> import multiprocess
>>> p1,p2 = multiprocess.Pipe()
>>> p1.send(c)
>>> c_ = p2.recv()
>>> c_
<sqlite3.Connection object at 0x104af8200>
目前还不清楚哪个连接对象是所询问的连接对象。 所以这是一个_multiprocess.Connection
对象,从multiprocess
传递Pipe
。
>>> c = p1.__class__
>>> p1.send(c)
>>> c_ = p2.recv()
>>> c_
<type '_multiprocess.Connection'>
但是,在尝试传递_multiprocess.Connection
对象实例而不是_multiprocess.Connection
对象类时...send
工作正常,但不幸的是,recv
将无法解开对象。
>>> p3,p4 = multiprocess.Pipe()
>>> p1.send(p3)
>>> p3_ = p2.recv()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mmckerns/lib/python2.7/site-packages/dill-0.2.5.dev0-py2.7.egg/dill/dill.py", line 259, in loads
return load(file)
File "/Users/mmckerns/lib/python2.7/site-packages/dill-0.2.5.dev0-py2.7.egg/dill/dill.py", line 249, in load
obj = pik.load()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 864, in load
dispatch[key](self)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1089, in load_newobj
obj = cls.__new__(cls, *args)
TypeError: Required argument 'handle' (pos 1) not found
>>>
如果最后一个案例有效,你可以做一些非常酷的事情,我想。 也许值得向dill
或multiprocess
提交票证,并要求它工作?
你遇到的问题是Python 3中已经修复的错误。
我的建议是在子进程而不是父进程上打开连接。另一种方法是在生成新子进程之前打开父进程上的连接,并通过继承传递连接。
无论如何,这些是更正确的方法,而不是跨管道传递有状态对象。