Обращение к переменной из потока

Перешел на 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 работать с полями из нескольких потоков? Нужно юзать очередь и блокировки потоков в момент работы с общей переменной? Или как говорится "и так сойдет..."


Ответы (0 шт):