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

时间:2016-01-28 10:06:42

标签: python python-2.7 parallel-processing operating-system multiprocessing

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

THREE.Geometry

我知道连接对象不可拣选。由于send()仅作为参数可选对象,因此我无法发送连接对象。那我怎么能这样做呢?

2 个答案:

答案 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中修复。

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

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