qt5 python 3.6程序中的共享全局状态

时间:2018-04-14 21:59:41

标签: python multithreading global-variables opc-ua

我正在尝试使用名为“global_data”的模块来保存全局状态信息但没有成功。代码已经变大了,所以我会尝试只发布基本要素。

from view import cube_control
from ioserver.ioserver import IOServer
from manager import config_manager, global_data
if __name__ == "__main__":
    #sets up initial data
    config_manager.init_manager()
    #modifies data
    io = IOServer()
    #verify global data modified from IOServer.__init__
    global_data.test() #success
    #start pyqt GUI
    cube_control.start_view()

到目前为止一切顺利。但是在最后一行cube_control.start_view()中输入了以下代码:

#inside cube_control.py
def start_view():
    #verify global data modified from IOServer.__init__
    global_data.test() #fail ?!?!
    app = QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

在这种情况下运行 global_data.test()失败。打印整个全局状态显示它现在以某种方式通过config_manager.init_manager()恢复到数据设置

这怎么可能?

当Qt正在运行时,我每隔10秒调用一次调度程序,同时报告测试失败。

但是,一旦Qt GUI停止(单击“x”),我从控制台运行测试,它就会再次成功。

在global_data模块中,我试图将数据存储在一个简单的python对象和内存数据库中的ZODB的dict中:

#inside global_data
state = {
    "units" : {}
}
db = ZODB.DB(None) #creates an in memory db
def test(identity="no-id"):
    con = db.open()
    r = con.root()
    print("test online: ", r["units"]["local-test"]["online"], identity)
    con.close()

两者都有完全相同的问题。测试之上只能使用db。

我尝试使用db的原因是我理解线程可以创建一个全新的全局字典。然而,2个第一次测试是在同一个线程中。循环的是自己的线程,可能会产生这样的问题......?

文件组织

如果它有助于我的程序按以下结构组织:

enter image description here

还有一个带有一些qt5 GUI文件的“view”文件夹。

IOServer尝试使用opcua模块连接到一堆OPC-UA服务器。没有线程在那里手动启动,虽然我认为opcua模块确实保持连接。

global_data id()

我还尝试将(id(global_data))与测试一起打印,并发现IOServer和顶级代码中的ID相同,但在cube_control.py #start_view 中更改。这些模块总是应该引用相同的模块吗?

1 个答案:

答案 0 :(得分:0)

我还不确定究竟发生了什么。但显然这是通过删除名为manager的文件夹中的 init .py文件来解决的。现在所有导入的模块名为" global_data"指向相同的ID。

如何使用 init .py文件导致同一模块的第二个实例仍然是个谜?