【问题标题】:How do I send connection objects using Pipe() in python?如何在 python 中使用 Pipe() 发送连接对象?
【发布时间】:2016-05-05 15:29:57
【问题描述】:

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

pipe_i.send(diff_connection_object)

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

【问题讨论】:

  • 你得到什么错误?请添加回溯。
  • 与 Mike Mckerns 回复中的错误相同

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


【解决方案1】:

如果您使用称为multiprocessmultiprocessing 的分支,那么它应该适用于您要发送的几乎任何连接对象。 fork 使用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 对象与来自 multiprocessPipe 一起传递。

>>> 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 提交票证并请求它工作?

【讨论】:

  • 但我无法将对象传递给类'class multiprocessing.Connection'。
  • ??? -- multiprocessingmultiprocess 在命名空间的顶部都没有 Connection,据我所知。您能否就您的要求提供更多信息,特别是哪些connection 对象?
  • connection 用于进程间 Pipe() 通信的对象。multiprocessing.pipe
【解决方案2】:

我猜您遇到的问题是 bug,它已在 Python 3 中得到修复。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2015-06-29
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多