Python multiprocessing.Process子类的属性
我有两个进程,它们需要互相通信:
文件 hwmgr.py:
import multiprocessing as mp
from setproctitle import setproctitle
import smbus
import myLoggingModule as log
class HWManager(mp.Process):
def __init__(self):
mp.Process.__init__(self)
self.i2c_lock = mp.Lock()
def run(self):
setproctitle('hwmgr')
# self.logger = log.config_logger(**kwargs)
def get_voltage(self):
with self.i2c_lock:
# ...do i2c stuff to get a voltage with smbus module
# self.logger.debug('Got a voltage: %s', voltage)
return voltage
文件 main.py:
import hwmgr
hwm = hwmgr.HWManager()
hwm.start()
battery = hwm.get_voltage()
print battery # Works!
有趣的是,这个运行得很正常 - 方法调用返回了电压值,没有任何特别的多进程技巧。 但是,如果我启用涉及日志记录的那两行代码,当遇到 logger.debug() 调用时,我得到了:
AttributeError: 'HWManager' object has no attribute 'logger'
确实,如果我在那个地方打印 dir(self)
,它没有 logger
。
我搞不懂?? 我的 logger 到哪里去了?
logger 定义在 run()
方法中,而不是 __init__()
的原因是因为我想要新进程的根 logger,并且 logger 的文件名是从新进程的标题(getproctitle()
)获取的,而这个在 __init__()
方法完成后才能调用 -- 当然,可能还有其他方法可以做到这一点,但我还没找到...
正在进行中的代码:
我已经去掉了对日志模块的引用 - 属性是什么并不重要。
如果你注释掉那行 print houdiniAttribute
,一切都会正常运行
为了明确,返回整数是可以的 - 消失的属性才是问题所在
文件 hwmgr.py:
import multiprocessing as mp
from setproctitle import setproctitle
import smbus
class HWManager(mp.Process):
def __init__(self):
mp.Process.__init__(self)
self.i2c_lock = mp.Lock()
def run(self):
setproctitle('hwmgr')
self.houdiniAttribute = 'ASDFGHJKL'
with self.i2c_lock:
pass # Set up I2C bus to take ADC readings
while True: # Doesn't matter if this is here...
pass
def get_voltage(self):
with self.i2c_lock:
voltage = 12.0 # Actually, do i2c stuff to get a voltage with smbus module
print self.houdiniAttribute
return voltage
文件 client.py:
import multiprocessing as mp
from setproctitle import setproctitle
from time import sleep
class HWClient(mp.Process):
def __init__(self, hwm):
mp.Process.__init__(self)
self.hwm = hwm
def run(self):
setproctitle('client')
while True:
battery = self.hwm.get_voltage()
print battery
sleep(5)
文件 main.py:
import hwmgr
import client
hwm = hwmgr.HWManager()
hwm.start()
cl = client.HWClient(hwm)
cl.start()
1 个回答
1
尝试澄清一下:
- 你在进程1中创建了一个进程对象1。
- 这个进程对象启动了一个新进程(进程2)。
- 在进程2中,调用了同一类的另一个对象(对象2)的
run()
方法。 run()
给对象2分配了一些属性。- 进程2完成后,删除了对象2。
- 进程1现在知道进程2已经结束,但对象1仍然保留着旧的属性。
如果你想要同步一些东西,可以看看管理器。
这样回答你的问题了吗?