Python - класс блокировки, доступ к которому осуществляется несколькими потоками - PullRequest
0 голосов
/ 05 июня 2018

У меня небольшая дилемма.Я пытаюсь добиться чего-то вроде этого:

import threading
import time

class A:

    def __init__(self):
        self.lock = threading.Lock()

    def print_stuff(self):
        with self.lock:
            ##  do some hazard with stuff !
            print("OK")

    def other_function(self):
        with self.lock:
            ## some more hazard stuff
            pass



def worker(a):
    while alive:
        """thread worker function"""
        a.print_stuff()


a = A()

alive = True
threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(a,))
    threads.append(t)
    t.start()


try:
    while True:
        pass
except KeyboardInterrupt:
    alive = False
    print('interrupted!')

Существует класс A - набор функций в основном, но с некоторыми свойствами.Он будет использоваться для связи с другими устройствами через HTTP или другой протокол.

Моя идея - заблокировать каждую функцию, чтобы предотвратить одновременный вызов двух функций экземпляра A.К моему удивлению, он работает и без блокировки, но пока я не делаю ничего опасного в функциях.

Мои вопросы:

Достаточно ли реализованной блокировкичтобы предотвратить любое касание одних и тех же ресурсов несколькими потоками (рабочие будут вызывать только функции, они не будут касаться свойств экземпляра A)?

Лучше ли сделать глобальную блокировку и заблокировать функцию непосредственно врабочий (вместо этого в экземпляре A)?Смотрите пример:

lock = threading.Lock()
def worker(a):
    while alive:
        """thread worker function"""
        with lock:
            a.print_stuff()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...