我无法在进程之间发送管道对象。
THREE.Geometry
我知道连接对象不可拣选。由于send()仅作为参数可选对象,因此我无法发送连接对象。那我怎么能这样做呢?
答案 0 :(得分:1)
如果您使用名为multiprocessing
的{{1}}分叉,那么它几乎适用于您要发送的任何连接对象。 fork使用multiprocess
而不是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
的{{1}}一起传递。
Pipe
但是,在尝试传递multiprocess
对象实例时,而不是>>> 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
>>>
的机票并要求它运作?
答案 1 :(得分:0)
我猜你遇到的问题是bug,已在Python 3中修复。
我的建议是打开子进程而不是父进程的连接。另一种方法是在生成新子进程并通过继承传递连接之前在父进程上打开连接。
无论如何,这些都是更正确的方法,而不是通过管道传递有状态的对象。