Python上的属性多处理过程子类

2024-05-15 12:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个流程需要相互沟通:

文件硬件管理器.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

文件主.py公司名称:

^{pr2}$

因此,有趣的是,这和预期的一样工作,电压由方法调用返回,而不需要任何特殊的多处理向导。 但是,如果我启用涉及记录器的两行,当logger.debug()遇到呼叫,我得到:

AttributeError: 'HWManager' object has no attribute 'logger'

而且,实际上,如果我打印一个dir(self),它就没有logger
我不明白??我的记录器去哪儿了?

之所以在run()方法中定义记录器,而不是__init__(),是因为我在新进程的根日志记录器后面,并且因为记录器的文件名取自新进程的标题(getproctitle()),直到进程在__init__()方法完成时分叉后才能调用——可能还有另一种方法当然要做这部分,但我还没找到。。。

WIP代码:
我删除了对日志模块的引用-属性是什么并不重要。
如果您注释掉print houdiniAttribute行,则一切都按预期工作

为了清楚起见,传递一个return int是有效的-正在消失的属性是个问题

文件硬件管理器.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

文件客户端.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)

文件主.py公司名称:

import hwmgr
import client

hwm = hwmgr.HWManager()
hwm.start()
cl = client.HWClient(hwm)
cl.start()

Tags: 文件pyimportself名称initdef公司
1条回答
网友
1楼 · 发布于 2024-05-15 12:31:16

试图澄清:

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

如果你想让事情同步化,看看经理们。 Multiprocessing Share Unserializable Objects Between Processes

这能回答你的问题吗?在

相关问题 更多 >