Python程序在另一个Python程序中运行线程,can';看不到全局变量
我有一个Python程序作为线程运行另一个模块(SqRt,在另一个Python文件中,dumb_water.py)。线程/模块确实在运行,它会打印一些注释让我知道。但是,调用它的顶级程序没有看到它(SqRt)创建的全局变量(结果)。如果我在同一个Python文件中有两段代码,那么一切都正常 我实际上是在尝试捕捉RPi上的图像,以响应按钮按下,所有操作都与线极化有关,但让线作为线程运行不是这样的(极化是每帧的,因此如果帧速率非常低,它可能会错过按钮按下) 下面的代码是一些测试代码,非常简单。它在dumb_water.py中调用SqRt(胡闹,名称很奇怪)。除了让我集中讨论变量的可见性问题之外,它没有其他用途Python程序在另一个Python程序中运行线程,can';看不到全局变量,python,multithreading,python-3.x,global-variables,global,Python,Multithreading,Python 3.x,Global Variables,Global,我有一个Python程序作为线程运行另一个模块(SqRt,在另一个Python文件中,dumb_water.py)。线程/模块确实在运行,它会打印一些注释让我知道。但是,调用它的顶级程序没有看到它(SqRt)创建的全局变量(结果)。如果我在同一个Python文件中有两段代码,那么一切都正常 我实际上是在尝试捕捉RPi上的图像,以响应按钮按下,所有操作都与线极化有关,但让线作为线程运行不是这样的(极化是每帧的,因此如果帧速率非常低,它可能会错过按钮按下) 下面的代码是一些测试代码,非常简单。它在d
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_water.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秒钟
结果是[sqrt 2',1.4142135623730951]
显然线程正在工作,但是我看不到调用dumb_water.py的早期代码中的全局变量Result,因此我没有在顶级代码中执行print(“test dumb_water,output is”,Result)指令。正如我所说,将其全部放在一个Python文件中,一切都很好
那么,当两个程序位于不同的Python文件中时,如何创建线程代码修改的变量,以及顶级代码可以看到的变量呢?在
dumb_water.py
中,当您编写全局结果时,您并没有在第一个文件中引用名为Result
的变量。如果不引入循环依赖项,引用此变量将很困难
一种方法是创建第三个文件,shared_variable.py
:
Result = False
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
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)
然后在dumb\u water.py
中:
Result = False
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
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)
在test.py
中:
Result = False
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
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
。在dumb\u water.py
中,当您编写全局结果时,您没有在第一个文件中引用名为Result
的变量。如果不引入循环依赖项,引用此变量将很困难
一种方法是创建第三个文件,shared_variable.py
:
Result = False
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
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)
然后在dumb\u water.py
中:
Result = False
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
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)
在test.py
中:
Result = False
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
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
。连接线程的好方法。在真实的程序中,我仍然会将结果(在帧之间)极化,以查看按钮是否已按下。我已经用一个(在我看来)非常不雅观的解决方案解决了这个问题。我将import dumb#water添加为d#,以尽量减少以后的打字。从dumb_导入*,然后将结果称为d.Result。很抱歉,似乎无法获得cr,因此布局很差。关于加入线程的观点很好。在真实的程序中,我仍然会将结果(在帧之间)极化,以查看按钮是否已按下。我已经用一个(在我看来)非常不雅观的解决方案解决了这个问题。我将import dumb#water添加为d#,以尽量减少以后的打字。从dumb_导入*,然后将结果称为d.Result。抱歉,似乎无法获得cr,因此布局不佳。