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

时间:2016-04-11 17:34:15

标签: python multithreading python-3.x global-variables global

我有一个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文件中时,如何创建线程代码修改的变量,顶层代码可以看到?

1 个答案:

答案 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