Python 如何从不同模块访问相同的多处理命名空间
我需要能够创建包含pySerial对象的共享对象。在从位置列表中找到设备后,子进程只会创建一次此对象。其他进程将在以后使用它 Python多处理管理器无法了解嵌入到其他对象中的对象的更改。 因此,如果我创建管理器:Python 如何从不同模块访问相同的多处理命名空间,python,module,namespaces,multiprocessing,python-multiprocessing,Python,Module,Namespaces,Multiprocessing,Python Multiprocessing,我需要能够创建包含pySerial对象的共享对象。在从位置列表中找到设备后,子进程只会创建一次此对象。其他进程将在以后使用它 Python多处理管理器无法了解嵌入到其他对象中的对象的更改。 因此,如果我创建管理器: import multiprocessing as mp manager=mp.Manager() ns=manager.Namespace() 我可以在进程之间共享对象 ns.obj = SerialReader() 在哪里 class SerialReader(object)
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)其中
但我不能引用ns.obj.ser,因为如果它将从新进程运行,它将被协调为未定义。如果我们在conntrollers.py中的其他方法中引用self.ser并尝试在新流程中运行它们,我们将遇到相同的情况
编辑:我找到了将命名空间导入模块的方法:
from __main__ import ns
或者在创建对象时将ns发送到init。
但问题依然存在。ns.obj是非类型对象,因为此对象仍在创建过程中。所以我不能输入ns.obj.ser=self.ser
如果我尝试向SerialReader()发送ns
并尝试在SerialReader_init_uu中打印它,我得到:
我也不能将ser添加到其中。不同的进程有不同的地址空间,因此变量
ns
只能在一个进程中使用(除非使用共享内存)。您考虑过多线程吗?谢谢您的评论。是的,我在这种情况下使用它。我已经纠正了一个小问题。也许现在更容易理解了。
from __main__ import ns
ns.obj = SerialReader(ns)
<NamespaceProxy object, typeid 'Namespace' at 0xa21b70c; '__str__()' failed>