Python 在函数中定义全局变量并传递给类
有谁能帮忙吗, 我尝试每隔x分钟从下面代码中定义的类进程中采样一次数据(在这里没有显示的其他函数调用时运行) 为此,我每X分钟运行一次调度程序函数,由主函数启动,由函数minmax_job执行 然而,我的函数minmax_job似乎不知道i的初始值 我已经试了很多次关于放置全局变量等等,但它仍然不知道I=0(最初)Python 在函数中定义全局变量并传递给类,python,class,function,global-variables,Python,Class,Function,Global Variables,有谁能帮忙吗, 我尝试每隔x分钟从下面代码中定义的类进程中采样一次数据(在这里没有显示的其他函数调用时运行) 为此,我每X分钟运行一次调度程序函数,由主函数启动,由函数minmax_job执行 然而,我的函数minmax_job似乎不知道i的初始值 我已经试了很多次关于放置全局变量等等,但它仍然不知道I=0(最初) i=0 atc、otc、tssc=0,0,0 atf、otf、tssf=假、假、假 类进程(threading.Thread): def uuu init uuuuu(自、缓冲区3、
i=0
atc、otc、tssc=0,0,0
atf、otf、tssf=假、假、假
类进程(threading.Thread):
def uuu init uuuuu(自、缓冲区3、广播服务器):
threading.Thread.\uuuuu init\uuuuuu(自)
self.setDaemon(True)
self.buffer3=buffer3
self.factory=广播服务器
def运行(自):
今天=日期时间。现在()
上次运行的全局时间
全局atv1、atv2、atv3、otv1、otv2、otv3、tssv1、tssv2、tssv3
全球atf、otf、tssf
全球atc、otc、tssc
如果self.buffer3.startswith('厨房水族馆:温度:'):
self.temp=self.buffer3.替换('厨房水族馆:温度:','')
自我工厂广播(“水族箱温度%s”%自我温度)
如果atc==1且atf:
atv1=浮动(自身温度)
atf=错误
elif atc==2和atf:
atv2=浮动(自身温度)
atf=错误
elif atc==3和atf:
atv3=浮动(自身温度)
atf=错误
def minmax_作业():
全局atv1、atv2、atv3、otv1、otv2、otv3、tssv1、tssv2、tssv3
全球atf、otf、tssf
全球atc、otc、tssc、i
如果i==3:
i=0
atc=0
如果i<4:
atc=atc+1
atf=真
i=i+1
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
minmax_调度程序=调度程序()
minmax_调度程序。添加_间隔_作业(minmax_作业,秒=10)
minmax_调度程序.start()
我需要声明为全局,然后在外部作用域分配一个值,如本演示所示
global i
i=0
def rabbit():
global i
print "rabbit ",i
#main here
if __name__ == '__main__':
rabbit()
上面的@Pillmuncher,有一个正确的想法作为副评论。我会给你一个完整的答案。您正试图通过全局变量在进程和/或线程之间共享数据。这是一种非常不正确的方法。如果月亮的相位是正确的,并且你不改变你在哪里发表评论,有时它可能会起作用,有时也可能不会 原因很复杂,但足以说明你应该找一家公司。Sci。有关操作系统的教科书,并查找以下术语:
- 分叉
- 线程安全
- 多处理
- 受保护内存
- 竞赛条件
- 消息队列
- 进程间通信
- 螺纹锁
- 堆栈内存分配
- 堆内存
一般来说,您更喜欢多处理。多线程处理充满了麻烦,虽然它可以更快地执行,但您几乎不需要这样的速度。这种速度伴随着危险和麻烦,大量的调试时间(现在和以后),以及非常非常小心。最好像我这样的老前辈那样做:让多处理成为你的朋友,把线程扔进[主要是以微软为中心的]垃圾堆,不要去那里。哦,天哪!请把它拿走@Ossama:通过全局变量(在您的例子中有很多)在线程之间进行无锁通信是desaster的一个秘诀。另外,您的
进程
线程有一个run()
-方法,该方法执行一些语句,然后立即终止。通常,应该有一个循环。您的进程
线程似乎与您描述的问题无关,因为它不在i
@Ossama上运行:而且,如果您开始为变量编号,您真正想要的是一个列表。事实并非如此。在执行rabbit()
中的print
语句之前,只需要在全局命名空间中存在i
,或者在rabbit()
中为i
赋值。不需要在全局命名空间中声明i
global。pillmuncher,我认为你是对的,但是OP的问题在def块中有一个全局i。在OP的示例列表中,根据OP,这是使作用域有效所必需的。我将让其他人评论OP的代码
global i
i=0
def rabbit():
global i
print "rabbit ",i
#main here
if __name__ == '__main__':
rabbit()