Python程序在另一个Python程序中运行线程,can';看不到全局变量

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

我有一个Python程序作为线程运行另一个模块(SqRt,在另一个Python文件中,dumb_water.py)。线程/模块确实在运行,它会打印一些注释让我知道。但是,调用它的顶级程序没有看到它(SqRt)创建的全局变量(结果)。如果我在同一个Python文件中有两段代码,那么一切都正常

我实际上是在尝试捕捉RPi上的图像,以响应按钮按下,所有操作都与线极化有关,但让线作为线程运行不是这样的(极化是每帧的,因此如果帧速率非常低,它可能会错过按钮按下)

下面的代码是一些测试代码,非常简单。它在dumb_water.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_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,因此布局不佳。