У меня небольшая дилемма.Я пытаюсь добиться чего-то вроде этого:
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()