Я понимаю из этого вопроса, что, если я хочу иметь set
, который является потокобезопасным, я должен сам реализовать часть безопасности потока.
Поэтому я мог бы придумать:
from threading import Lock
class LockedSet(set):
"""A set where add() and remove() are thread-safe"""
def __init__(self, *args, **kwargs):
# Create a lock
self._lock = Lock()
# Call the original __init__
super(LockedSet, self).__init__(*args, **kwargs)
def add(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).add(elem)
finally:
self._lock.release()
def remove(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).remove(elem)
finally:
self._lock.release()
Таким образом, конечно, только add() и remove() являются потокобезопасными в этой реализации. Другие методы не потому, что они не были перезаписаны в подклассе.
Теперь шаблон довольно прост: получить блокировку, вызвать оригинальный метод, заблокировать блокировку.
Если я следую логике выше, мне придется переписать все методы, открытые set
, по существу таким же образом, например:
(псевдокод)
def <method>(<args>):
1. acquire lock
2. try:
3. call original method passing <args>
4. finally:
5. release lock
(/псевдокод)
Это не только утомительно, но и подвержено ошибкам. Итак, любые идеи/предложения о том, как лучше подойти к этому?