我有一个Python程序作为线程运行另一个模块(SqRt,在不同的Python文件中,dumb_waiter.py)。线程/模块确实运行,它打印一些注释让我知道。但是,调用它的顶级程序没有看到它(SqRt)创建的全局变量(Result)。如果我在同一个Python文件中都有两个代码,那么一切都可以。
我实际上是试图在按下按钮的情况下捕获RPi上的图像,所有都使用poling线,但是让它作为线程运行不是(poling是每帧,所以如果帧速率很高低,它可能会错过按钮)。
下面的代码是一些测试代码,非常简单。它在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秒,所以我可以很容易地想象出超过1个线程运行.....: -
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文件中时,如何创建线程代码修改的变量,顶层代码可以看到?
答案 0 :(得分:0)
在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
。