如何在 python 中使用 Pipe() 发送连接对象



我无法在进程之间发送管道对象。

pipe_i.send(diff_connection_object)

我知道连接对象是不可挑选的。由于 send() 仅将可选择的对象作为参数,因此我无法发送连接对象。那么我该怎么做呢?

如果您使用名为 multiprocessmultiprocessing分支,那么它应该适用于您要发送的几乎任何连接对象。 分支使用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
>>> 

如果最后一个案例有效,你可以做一些非常酷的事情,我想。 也许值得向dillmultiprocess提交票证,并要求它工作?

我想

你遇到的问题是Python 3中已经修复的错误。

我的建议是在子进程而不是父进程上打开连接。另一种方法是在生成新子进程之前打开父进程上的连接,并通过继承传递连接。

无论如何,这些是更正确的方法,而不是跨管道传递有状态对象。

最新更新