重く聞こえるかもしれませんが、私は架空の状況を解決しようとしています。あるオブジェクトのオブザーバーがN人いると想像してください。それぞれがオブジェクトの状態に関心があります。オブザーバーパターンを適用すると、オブザーバブルオブジェクトはオブザーバーメソッドを呼び出すオブザーバーリストを反復処理する傾向がありますnotify()|update()
。
ここで、特定のオブザーバーが、オブザーバブルオブジェクトの状態に関係する多くの作業を行っていると想像してください。たとえば、最後の通知が遅くなります。
したがって、すべてのオブザーバーへの通知が遅くなるのを避けるために、私たちができることの1つは、別のスレッドでオブザーバーに通知することです。それが機能するためには、各オブザーバーのスレッドが必要だと思います。これは、重労働による通知の速度低下を回避するために私たちが抱えている苦痛なオーバーヘッドです。スレッドアプローチを使用する場合に速度を落とすよりも最悪なのは、無限ループによって引き起こされるデッドスレッドです。これについては、経験豊富なプログラマーを読むのは素晴らしいことです。
- デザインの問題に長年携わっている人々はどう思いますか?
- これは実質的な解決策のない問題ですか?
- それは本当に悪い考えですか?なぜ?
例
これは、私がテストすらしていない基本的な考え方を示し、うまくいけば明確にするための漠然とした例です。
class Observable(object):
def __init__(self):
self.queues = {}
def addObserver(self, observer):
if not observer in self.queues:
self.queues[observer] = Queue()
ot = ObserverThread(observer, self.queues[observer])
ot.start()
def removeObserver(self, observer):
if observer in self.queues:
self.queues[observer].put('die')
del self.queues[observer]
def notifyObservers(self, state):
for queue in self.queues.values():
queue.put(state)
class ObserverThread(Thread):
def __init__(self, observer, queue):
self.observer = observer
self.queue = queue
def run(self):
running = True
while running:
state = self.queue.get()
if state == 'die':
running = False
else:
self.observer.stateChanged(state)