[英]Python program runs thread in another Python program, can't see global variable
我有一个Python程序作为线程运行另一个模块(SqRt,在另一个Python文件dumb_waiter.py中)。 线程/模块确实在运行,它会打印一些注释以通知我。 但是,正在调用它的顶层程序没有看到它(SqRt)创建的全局变量(Result)。 如果我在同一个Python文件中都有这两位代码,就可以了。
我实际上是试图响应按钮的按下而在RPi上捕获图像,所有操作都可以使线路极化,但是不能像线程一样运行它(轮询是每帧,因此如果帧速率非常低,可能会错过按钮)。
下面的代码是一些测试代码,非常简单。 它会在dumb_waiter.py中调用SqRt(消息很混乱,名称很奇怪)。 除了让我专注于变量的可见性问题外,它没有其他目的。
import time
from threading import Thread
from dumb_waiter import SqRt
Result = False
Result1 = Thread(target = SqRt, args = ("sqrt 2", 2))
Result1.start()
while not Result:
pass
print("test dumb_waiter, output is", Result)
接下来是程序dumb_waiter.py。 我添加了1到10秒的随机延迟,因此我可以轻松地看到多个正在运行的线程.....:-
import time
from threading import Thread
from random import randint # this should be in the module below, but it works
def SqRt(VarName, MyNo):
global Result
Result = False
Wait = randint(1,10)
print("wait", Wait, "seconds")
time.sleep(Wait)
Result = [VarName, MyNo ** 0.5]
print("dumb_waiter result is", Result)
return
上面产生了以下输出:
等待2秒
dumb_waiter结果为['sqrt 2',1.4142135623730951]
显然,线程正在运行,但是我无法从调用dumb_waiter.py的早期代码中看到全局变量Result,因此无法在顶层代码中执行print(“ test dumb_waiter,output is”,Result)指令。 正如我所说的,将其全部放在一个Python文件中,并且一切正常.....
那么,当两个程序位于不同的Python文件中时,如何创建一个变量,供线程代码修改,并且顶层代码可以看到?
在dumb_waiter.py
,编写global Result
,您没有在第一个文件中引用名为Result
的变量。 如果不引入循环依赖关系,将很难引用该变量。
一种方法是创建第三个文件shared_variable.py
:
Result = False
然后在dumb_waiter.py
:
import time
from threading import Thread
import shared_variable
from random import randint # this should be in the module below, but it works
def SqRt(VarName, MyNo):
shared_variable.Result = False
Wait = randint(1,10)
print("wait", Wait, "seconds")
time.sleep(Wait)
shared_variable.Result = [VarName, MyNo ** 0.5]
print("dumb_waiter result is", Result)
return
在test.py
:
import time
import shared_variable
from threading import Thread
from dumb_waiter import SqRt
Result1 = Thread(target = SqRt, args = ("sqrt 2", 2))
Result1.start()
while not shared_variable.Result:
pass
print("test dumb_waiter, output is", shared_variable.Result)
这与您的原始代码相当接近,并且应该可以正常工作,但这不是一个好主意,因为while
循环正忙于等待。 更好的主意是在运行线程上调用join
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.