Обращение к переменной из потока
Перешел на python с c++, очень мучает вопрос обращения к полям инкапсулированного класса из потока, который создан внутри этого самого класса, а так же обращение к полям этого класса из другого инкапсулированного класса и из его потока.
Пример1:
class _1:
thread: threading
example_dict: dict
def __init__(self):
example_dict = dict{'value1': 'key1', 'value2': 'key2', 'value3': 'key3'}
thread = threading.Thread(target=self.example_func)
def example_func(self):
while True:
//непрерывная работа с `example_dict`
Вопрос 1:
Как мне нужно обращаться к полю example_dict? Я могу вызвать его в потоке self.example_dict, а могу передать в поток через argument list, при создании потока, и уже работать с ним там. Есть ли разница? Я проверял работает, что так, что так.
Пример 2:
class _1:
thread: threading
example_dict: dict
def __init__(self):
example_dict = dict{'value1': 'key1', 'value2': 'key2', 'value3': 'key3'}
thread = threading.Thread(target=self.example_func)
def example_func(self):
while True:
//непрерывная работа с `example_dict`
class _2:
def __init__(self, class1):
class1.example_dict.append('новый ключ': 'новое значение')
Вопрос 2:
Для меня очень странно, но, данный код тоже работает и я могу внести новую пару/ключ в dict. Что не так? Как правильно будет? Блокировать поток, в момент добавления новых пара/ключ, который работает с dict из первого класса?
Пример 3:
class _1:
thread: threading
def __init__(self):
example_dict = dict{'value1': 'key1', 'value2': 'key2', 'value3': 'key3'}
thread = threading.Thread(target=self.example_func)
def example_func(self):
while True:
//непрерывная работа с `example_dict`
class _2:
thread: threading
class1: class1
def __init__(self, class1):
self.class1 = class1
thread = threading.Thread(target=self.example_func)
def example_func(self):
while True:
//непрерывная работа с `self.class1.example_dict`
Вопрос 3:
Тут к сожалению код тоже работает, но к счастью, если есть 3 класс и более, который пытает получить доступ к полю example_dict из своего пространства или потока, иногда вываливается ошибка, я так понимаю, это ошибка доступа к адресному пространству поля/переменной example_dict. Тут уже конкретный вопрос, о том как python работать с полями из нескольких потоков? Нужно юзать очередь и блокировки потоков в момент работы с общей переменной? Или как говорится "и так сойдет..."