Общее глобальное состояние в программе qt5 python 3.6

Я безуспешно пытаюсь использовать модуль с именем 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 я попытался сохранить данные в dict внутри как простого объекта python, так и ZODB в базе данных памяти:

#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.

Причина, по которой я попытался использовать базу данных, заключается в том, что я понимаю, что потоки могут создавать совершенно новый глобальный словарь. Однако 2 первых теста находятся в одном потоке. Циклический находится в отдельном потоке и потенциально может создать такую ​​проблему ...?

Файловая организация

Если это поможет, моя программа имеет следующую структуру:

Общее глобальное состояние в программе qt5 python 3.6

Также есть папка "view" с некоторыми файлами графического интерфейса qt5.

IOServer пытается подключиться к группе серверов OPC-UA с помощью модуля opcua. Никакие потоки там не запускаются вручную, хотя я полагаю, что модуль opcua поддерживает подключение.

global_data id ()

Я попытался также напечатать (id (global_data)) вместе с тестами и обнаружил, что идентификатор такой же в IOServer И код верхнего уровня, но изменения внутри cube_control.py # start_view. Разве они не должны всегда относиться к одному и тому же модулю?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
49
1

Ответы 1

Я до сих пор не знаю, что именно произошло. Но, видимо, это было решено путем удаления файла в этом.py внутри папки с именем manager. Теперь весь импорт модуля с именем global_data указывает на один и тот же идентификатор.

Как использование файла в этом.py привело к появлению второго экземпляра того же модуля, остается загадкой.

Другие вопросы по теме