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

2024-10-03 02:32:40 发布

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

有谁能帮忙吗, 我试着每隔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()

Tags: 函数selffalseifjobglobaltempatf
2条回答

上面的Pillmuncher作为子评论的想法是正确的。我会给你一个完整的答案。您试图通过全局变量在进程和/或线程之间共享数据。这是一个非常不正确的方法。有时候,如果月亮的相位是正确的,你不改变你发表评论的地方,它可能有用也可能不起作用

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

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

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

如果你试图使用全局变量而不是来自多处理和线程模块的特性,你会在把自己吊在一个边沿上的同时朝自己的脚开枪:慢慢地,痛苦地,你会蔑视生命本身。在

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

这有很多正确做事的好例子。提前声明你的变量,把它们传递到每个线程/进程中,过上你真正想过的正派生活。在

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

我需要声明为global,然后在外部作用域分配一个值,如本演示所示

global i
i=0

def rabbit():
    global i
    print "rabbit ",i


#main here
if __name__ == '__main__':
    rabbit()

相关问题 更多 >