Python multiprocessing.Process子类的属性

3 投票
1 回答
1888 浏览
提问于 2025-04-18 00:46

我有两个进程,它们需要互相通信:

文件 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中创建了一个进程对象1。
  2. 这个进程对象启动了一个新进程(进程2)。
  3. 在进程2中,调用了同一类的另一个对象(对象2)的run()方法。
  4. run()给对象2分配了一些属性。
  5. 进程2完成后,删除了对象2。
  6. 进程1现在知道进程2已经结束,但对象1仍然保留着旧的属性。

如果你想要同步一些东西,可以看看管理器。

多进程共享不可序列化对象

这样回答你的问题了吗?

撰写回答