@wtfedor
Предприниматель, python разработчик.

Как обращаться к общему объекту из разных потоков threading?

Приветствую!
У меня есть два потока.
Thread1 в бесконечном цикле производит расчёты.
Thread2 обращается к медленной БД.
Для передачи данных между ними есть объект SharedObject.
Я раньше думал, что при обращении (чтению/записи атрибута, вызове метода) одного потока к SharedObject, для другого потока происходит блокировка любых обращений к SharedObject автоматически (GIL).
Сейчас я стал в этом сомневаться.
- - -
Вопросы:
1) Как обустроить обращение к общему объекту из разных потоков?
Я так понял, что в идеале нужно добавить Lock, но я не могу понять как работает конструкция with Lock?
from threading import Lock
shared_object_lock = Lock()
with shared_object_lock:
    self.shared_object.do_something()

2) Правильно ли в целом я делаю многопоточность в коде ниже (обработку прерывания для остановки опустил)?
class Thread1(Thread):
    def __init__(self, shared_object):
        Thread.__init__(self)
        self.shared_object = shared_object

    def run(self):
        while True:
            # что должно быть здесь?
            self.shared_object.do_something()


class Thread2(Thread):
    def __init__(self, shared_object):
        Thread.__init__(self)
        self.shared_object = shared_object

    def run(self):
        while True:
            # что должно быть здесь?
            self.shared_object.do_something_another()


class MainObj:
    def __init__(self):
        self.shared_object = SharedObject()

        self.thread_1 = Thread1(shared_object=self.shared_object)
        self.thread_2 = Thread2(shared_object=self.shared_object)

    def run(self):
        self.thread_1.start()
        self.thread_1.start()

- - -
Спасибо!
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы