读/写无限运行循环内/外的实例变量,类内扩展多处理过程Python 2.7版

2024-09-27 21:27:11 发布

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

python多处理中的实例变量

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

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

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

在一个扩展进程的类中,实例变量似乎不在无限运行循环的内部和外部共享,我很难找到文档,确切地说,您应该如何在pythons多进程中使用实例变量。你知道吗

下面代码中的问题是自触发运行循环和外部运行循环是不同的实例,因此从不调用回调函数。你知道吗

在扩展的类中,从无限运行循环内外读/写实例变量的正确方法是什么多处理过程在Python2.7中?

环境

Python 2.7.11 x64 OSX 10.10.5版

代码

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

输出

我们可以从程序的输出中看到自触发为False,然后更新为True,但这只发生在run循环之外,变量似乎没有共享。triggerTime也会更新,但只在循环外更新。你知道吗

进程计时器:run()-elapsedTime:1.00135803223e-05触发器为:触发时间为:1452437777.24

进程计时器:run()-elapsedTime:2.00103807449触发器is:假触发时间is:1452437777.24

进程计时器:run()-elapsedTime:4.00216698647触发器is:假触发时间is:1452437777.24

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

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

进程计时器:run()-elapsedTime:6.00229310989触发器是:触发时间是:1452437777.24

进程计时器:run()-elapsedTime:8.00314497948触发器is:假触发时间is:1452437777.24


Tags: runselftime进程iscallback时间timeout

热门问题