代码之家  ›  专栏  ›  技术社区  ›  Ossama

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

  •  1
  • Ossama  · 技术社区  · 13 年前

    有人能帮忙吗, 我试图每x分钟从下面代码中定义的类PROCESS中采样一次数据(无论何时被此处未显示的其他函数调用,它都会运行) 为了进行调度,我每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 回复  |  直到 12 年前
        1
  •  0
  •   Vorsprung    13 年前

    我需要被声明为全局的,然后在外部范围分配一个值,如本演示所示

    global i
    i=0
    
    def rabbit():
        global i
        print "rabbit ",i
    
    
    #main here
    if __name__ == '__main__':
        rabbit()
    
        2
  •  0
  •   Kevin J. Rice    12 年前

    @药丸咀嚼器 ,上面,有一个正确的想法作为子评论。我会给出一个完整的答案。您正试图通过全局变量在进程和/或线程之间共享数据。这是一个非常 不正确的 方法在某些时候,如果月相正确,并且你不改变发表评论的地方,这可能有效,也可能无效。

    原因很复杂,但足以说明你应该找到一个Comp。科学。关于操作系统的教科书,并查找以下术语:

    • 分叉
    • 螺纹安全性
    • 多重处理
    • 受保护存储器
    • 比赛条件
    • 消息队列
    • 进程间通信
    • 螺纹锁
    • 堆栈内存分配
    • 堆内存

    在Python中,多处理和线程模块都提供了许多函数来声明共享内存并保证其安全。你喜欢安全(即使你还不知道)。安全是好的。安全可以(但并不总是)快。

    如果你试图使用全局变量而不是多处理和线程模块的功能,你会在吊死在院子里的时候开枪自杀:缓慢而痛苦,你会蔑视生活本身。

    所以,请查看: http://docs.python.org/2/library/multiprocessing.html

    这里有很多以正确方式做事的好例子。提前声明你的变量,将它们传递到每个线程/进程中,过上你真正想要的正直生活。

    一般来说,更喜欢多处理。 多线程充斥着麻烦 可以 执行速度更快,你几乎永远不需要这样的速度。这种速度伴随着危险、麻烦、大量的调试时间(现在和以后)以及非常、非常、小心。最好做老前辈(比如我)所做的事情:让多处理成为你的朋友,并将线程转储到[主要以微软为中心]的垃圾堆中。

    推荐文章