在函数中定义全局变量并传递给类

时间:2013-02-19 11:20:23

标签: python class function global-variables

任何人都可以帮忙, 我试图从下面的代码中定义的类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()

2 个答案:

答案 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,将它们传递到每个线程/进程中,过你真正想要领导的正直生活。

一般来说,更喜欢多处理。多线程充满了麻烦,虽然 可以更快地执行,但您几乎从不需要这种速度。这种速度伴随着危险,麻烦,大量的调试时间(现在和以后),并且非常非常小心。最好做那些老前辈(像我一样)做的事情:让你的朋友进行多处理,并在[主要以微软为中心]的垃圾堆中转储线程。