我有两个流程要彼此沟通:
文件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__()
定义记录器的原因是因为我在新流程的根记录器之后,并且因为记录器&#39 ; s文件名取自新进程标题(getproctitle()
),直到进程在__init__()
方法完成时分叉后才能调用 - 可能还有另一种方法当然,做这一部分,但我还没有找到它......
在线代码:
我删除了对日志记录模块的引用 - 属性是什么并不重要。
如果您注释掉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()
答案 0 :(得分:1)
尝试澄清:
run()
。run()
为对象2指定属性。如果你想同步东西,看看经理。 Multiprocessing Share Unserializable Objects Between Processes
这会回答你的问题吗?