读/写无限运行循环内/外的实例变量,类内扩展多处理。Process Python 2.7 python多处理中的实例变量

读/写无限运行循环内/外的实例变量,类内扩展多处理。Process Python 2.7 python多处理中的实例变量,python,python-2.7,instance-variables,python-multiprocessing,Python,Python 2.7,Instance Variables,Python Multiprocessing,我有一个多进程程序,可以在一个串行端口上处理来自多个独立传感器的突发I/O数据。 在端口没有数据超时后,我想运行一个回调函数 我以前使用过线程(与下面的结构相同),但是锁定会过多地中断数据流,所以我尝试切换到多进程 对于多处理,I/O工作得非常好,但随后我遇到了问题: 在一个扩展进程的类中,实例变量似乎没有在无限运行循环的内部和外部共享,我很难找到关于如何将实例变量用于pythons多处理的文档 下面代码中的问题是,运行循环中的self.triggered和运行循环外的self.triggere

我有一个多进程程序,可以在一个串行端口上处理来自多个独立传感器的突发I/O数据。 在端口没有数据超时后,我想运行一个回调函数

我以前使用过线程(与下面的结构相同),但是锁定会过多地中断数据流,所以我尝试切换到多进程

对于多处理,I/O工作得非常好,但随后我遇到了问题:

在一个扩展进程的类中,实例变量似乎没有在无限运行循环的内部和外部共享,我很难找到关于如何将实例变量用于pythons多处理的文档

下面代码中的问题是,运行循环中的self.triggered和运行循环外的self.triggered是不同的实例,因此永远不会调用回调函数

在Python2.7中扩展multiprocessing.Process的类中,从无限运行循环内部/外部读取/写入实例变量的正确方法是什么

环境 Python 2.7.11 x64 OSX 10.10.5

代码 输出 我们可以在程序的输出中看到self.trigger为False,然后更新为True,但这只发生在运行循环之外,变量似乎没有共享。triggerTime也会更新,但仅在循环之外

ProcessTimer:run()-elapsedTime:1.00135803223e-05触发器为:FalsetriggerTime为:1452437777.24

ProcessTimer:run()-elapsedTime:2.00103807449触发器为:假触发器时间为:1452437777.24

ProcessTimer:run()-elapsedTime:4.00216698647触发器为:假触发器时间为:1452437777.24

ProcessTimer:restartTimer()-触发器为:False触发器时间为:1452437777.23

ProcessTimer:restartTimer()-现在触发器设置为:True触发器时间为:1452437782.24

ProcessTimer:run()-elapsedTime:6.00229310989触发器为:FalsetriggerTime为:1452437777.24

ProcessTimer:run()-elapsedTime:8.00314497948触发器为:假触发器时间为:1452437777.24

from multiprocessing import Process
import time
class ProcessTimer(Process):
    def __init__(self, callback, timeout):
        Process.__init__(self)
        self.callback = callback
        self.timeout = timeout
        self.trigger = False
        self.time = time.time()
        self.nap = self.timeout / 4
        self.triggerTime = time.time()
        
    def run(self):
        self.triggerTime = time.time()

        while 1:
            # check how much time has passed
            # test callback
            # self.callback() # this works
            elapsedTime = time.time() - self.triggerTime
            print "ProcessTimer: run() - elapsedTime:" + str(elapsedTime) + " trigger is: " + str(self.trigger) + " triggerTime is: " + str(self.triggerTime)
            if (elapsedTime > self.timeout):
                if (self.trigger):
                    print "ProcessTimer: run() - trigger callback is true - this never happens(?)" + str(self.timeout) 
                    self.trigger = False
                    self.callback()
            
            time.sleep(self.nap)

    def restartTimer(self):
        print "ProcessTimer: restartTimer() - trigger was: " + str(self.trigger) + " triggerTime was: " + str(self.triggerTime)
        self.triggerTime = time.time()
        self.trigger = True
        print "ProcessTimer: restartTimer() - now trigger is set to: " + str(self.trigger) + " triggerTime is: " + str(self.triggerTime)
              
def testfunc():
    print "func called"

if __name__ == '__main__':
    
    t = ProcessTimer(testfunc, 10)
    t.start()
    time.sleep(5)
    t.restartTimer()