1

任何人都可以帮忙吗,我正在尝试从下面代码中定义的类 PROCESS 中每 x 分钟采样一次数据(只要由此处未显示的其他函数调用时运行)来安排这个,我每 X 分钟运行一个调度程序函数,由 MAIN 函数启动并由函数 minmax_job 执行。

但是我的函数 minmax_job 似乎不知道我尝试过的关于放置全局变量等的初始值,但它仍然不知道 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()
4

2 回答 2

0

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

global i
i=0

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


#main here
if __name__ == '__main__':
    rabbit()
于 2013-02-19T12:06:03.403 回答
0

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

造成这种情况的原因很复杂,但足以说明您应该找到一个 Comp。科学。操作系统教科书并查找以下术语:

  • 分叉
  • 线程安全
  • 多处理
  • 受保护的记忆
  • 比赛条件
  • 消息队列
  • 进程间通信
  • 线程锁
  • 堆栈内存分配
  • 堆内存

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

如果您尝试使用全局变量而不是多处理和线程模块中的功能,那么您将在将自己吊在围场上的同时将自己开枪打死:缓慢而痛苦地,您会鄙视生活本身。

因此,请查看: http ://docs.python.org/2/library/multiprocessing.html

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

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

于 2013-12-27T20:42:16.117 回答