任何人都可以帮忙, 我试图从下面的代码中定义的类PROCESS中每隔x分钟对数据进行一次采样(无论何时由此处未显示的其他函数调用,都会运行) 为了安排这个,我每隔X分钟运行一个调度程序函数,由MAIN函数启动并由函数minmax_job执行。
然而我的函数minmax_job似乎不知道i的初始值 我已经尝试过关于放置全局变量等等,但它仍然不知道i = 0(最初)
i = 0
atc,otc,tssc = 0,0,0
atf,otf,tssf = False,False,False
class Process(threading.Thread):
def __init__(self, buffer3, broadcast_server):
threading.Thread.__init__(self)
self.setDaemon(True)
self.buffer3 = buffer3
self.factory = broadcast_server
def run(self):
today = datetime.now()
global time_of_last_run
global atv1,atv2,atv3,otv1,otv2,otv3,tssv1,tssv2,tssv3
global atf,otf,tssf
global atc,otc,tssc
if self.buffer3.startswith('kitchen aquarium: temp:'):
self.temp = self.buffer3.replace('kitchen aquarium: temp:','')
self.factory.broadcast("Aquarium temperature %s" % self.temp)
if atc == 1 and atf:
atv1 = float(self.temp)
atf = False
elif atc == 2 and atf:
atv2 = float(self.temp)
atf = False
elif atc == 3 and atf:
atv3 = float(self.temp)
atf = False
def minmax_job():
global atv1,atv2,atv3,otv1,otv2,otv3,tssv1,tssv2,tssv3
global atf,otf,tssf
global atc,otc,tssc,i
if i == 3:
i = 0
atc = 0
if i < 4:
atc = atc + 1
atf = True
i = i + 1
if __name__ == '__main__':
minmax_scheduler = Scheduler()
minmax_scheduler.add_interval_job(minmax_job, seconds=10)
minmax_scheduler.start()
答案 0 :(得分:0)
我需要声明为全局,然后在外部作用域中分配一个值,如此演示所示
global i
i=0
def rabbit():
global i
print "rabbit ",i
#main here
if __name__ == '__main__':
rabbit()
答案 1 :(得分:0)
@Pillmuncher ,上面有正确的想法作为子评论。我会把它作为一个完整的答案。您正试图通过全局变量在进程和/或线程之间共享数据。这是一个非常 INCORRECT 方法。如果月亮的阶段是正确的,并且你没有改变你发表评论的地方等,那么它可能有效或有时可能无效。
原因很复杂,但足以说你应该找到一个Comp。科学。有关操作系统的教科书,请查看以下术语:
在Python中,多处理和线程模块都提供了许多函数来声明共享内存并保证其安全。你喜欢安全(即使你还不知道)。安全是好的。安全可以(但并非总是)快。
如果你试图使用全局变量而不是多处理和线程模块中的特征,那么你就可以将自己从一个码头上吊起来:慢慢地,痛苦地,你会蔑视生命本身。
所以,请查看:http://docs.python.org/2/library/multiprocessing.html
这有很多以正确方式做事的好例子。提前宣布你的vars,将它们传递到每个线程/进程中,过你真正想要领导的正直生活。
一般来说,更喜欢多处理。多线程充满了麻烦,虽然 可以更快地执行,但您几乎从不需要这种速度。这种速度伴随着危险,麻烦,大量的调试时间(现在和以后),并且非常非常小心。最好做那些老前辈(像我一样)做的事情:让你的朋友进行多处理,并在[主要以微软为中心]的垃圾堆中转储线程。