我有一个多进程程序,处理来自多个独立传感器的一个串行端口上的突发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
目前没有回答
相关问题 更多 >
编程相关推荐