Python multiprocessing.Process子类的属性

时间:2014-04-01 01:07:04

标签: python logging multiprocessing

我有两个流程要彼此沟通:

文件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()

1 个答案:

答案 0 :(得分:1)

尝试澄清:

  1. 您在流程1中创建流程对象1
  2. 流程对象产生一个新流程(流程2)
  3. 在过程2中,在同一类的另一个对象(对象2)上调用run()
  4. run()为对象2指定属性。
  5. 处理2完成并删除对象2.
  6. 进程1现在知道进程2已完成。对象1仍然具有旧属性。
  7. 如果你想同步东西,看看经理。 Multiprocessing Share Unserializable Objects Between Processes

    这会回答你的问题吗?