如何从不同的模块访问相同的多处理命名空间

时间:2013-04-01 12:34:08

标签: python module namespaces multiprocessing python-multiprocessing

我需要能够使用pySerial对象创建共享对象。从位置列表中查找设备后,此对象将仅由子进程创建一次。其他进程将在以后使用它。

Python多处理管理器无法了解嵌入到其他对象的对象的更改。 所以,如果我创建经理:

import multiprocessing as mp
manager=mp.Manager()
ns=manager.Namespace()

我可以在进程之间共享对象。

ns.obj = SerialReader()

其中

class SerialReader(object):

    port = None
    def connect(self):

        #some code to test connected device 
        ...
        #end of that code

        ser=serial.Serial(device, etc)
        self.ser=ser 
        #or
        self.saveport() #for future use

    def saveport(self):
        self.port = self.ser._port
        ns.port= self.ser._port

现在我将在子进程中运行它:

p=Process(target = ns.obj.connect)
p.start()

并打印结果:

print ns.obj.port
print ns.port

输出:

None
/dev/ttyACM0

我想能够使用简单的代码,如:

ns.obj.ser.write(), ns.obj.somemethod(arg)其中

...inside SerialReaders class...
def somemethod(self, arg):
    if arg == condition:
        self.ser.write('some text %s' %arg)

但是我无法对ns.obj.ser进行引用,因为如果它将从新进程运行,它将被定义为未定义。如果我们将在conntrollers.py中的其他方法中引用self.ser并尝试在新进程中运行它们,我们将获得相同的情况。

编辑:我找到了将命名空间导入模块的方法:

from __main__ import ns

或在创建对象时将ns发送到 init 。 但问题仍然存在。 ns.obj是NoneType对象,因为此对象仍在创建过程中。所以我不能输入ns.obj.ser = self.ser 如果我尝试将ns发送到SerialReader()

ns.obj = SerialReader(ns)

并尝试在SerialReader_ init 中打印_我得到:

<NamespaceProxy object, typeid 'Namespace' at 0xa21b70c; '__str__()' failed>

我也无法添加ser ..

0 个答案:

没有答案