繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM