繁体   English   中英

Python multiprocessing.Process子类的属性

[英]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()

试图澄清:

  1. 您在流程1中创建流程对象1
  2. 进程对象产生一个新进程(进程2)
  3. 在进程2中,在同一个类的另一个对象(对象2)上调用run()
  4. run()将属性分配给对象2。
  5. 过程2完成并移除对象2。
  6. 过程1现在知道过程2已完成。 对象1仍然具有旧属性。

如果你想同步东西,看看经理。 多处理在进程之间共享不可序列化的对象

这回答了你的问题了吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM