[英]Attributes on Python multiprocessing.Process subclasses
我有两个流程,我想彼此沟通:
文件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
。
我不明白吗? 我的记录器在哪里?
在run()
方法中定义记录器而不是__init__()
的原因是因为我在新进程的根记录器之后,并且因为记录器的文件名取自新进程标题( getproctitle()
)直到进程在__init__()
方法完成后分叉才能调用 - 当然,可能还有另一种方法来完成这一部分,但我还没有找到它......
WIP代码:
我删除了对日志记录模块的引用 - 属性是什么并不重要。
如果你注释掉行print houdiniAttribute
,一切都按预期工作
为了清楚起见,传递一个返回int工作 - 消失的属性是关注点
文件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
file 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()
试图澄清:
run()
。 run()
将属性分配给对象2。 如果你想同步东西,看看经理。 多处理在进程之间共享不可序列化的对象
这回答了你的问题了吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.