我目前正在做一个包含三个组件的项目,
检查目录、工作器和命令行界面中更改的观察者。
我想要实现的是:
我不知道如何使用python来实现这一点,因为要使用哪个组件以及如何链接这三个组件。
我认为作为一个单例工作者,观察者将作业添加到队列中,但1)我无法编写工作代码,2)我如何才能适应检查器?
我想到的另一个解决方案可能是来自一个拥有队列的父进程的多个子进程,但我有点迷路了……
感谢您的建议
发布于 2018-07-10 04:38:28
我会使用某种observer pattern或publish-subscribe pattern。对于前者,您可以使用例如ReactiveX的Python version。但对于更基本的示例,让我们继续使用Python核心。例如,程序的某些部分可以订阅工作进程,并通过队列从进程接收更新。
import itertools as it
from queue import Queue
from threading import Thread
import time
class Observable(Thread):
def __init__(self):
super().__init__()
self._observers = []
def notify(self, msg):
for obs in self._observers:
obs.put(msg)
def subscribe(self, obs):
self._observers.append(obs)
class Observer(Thread):
def __init__(self):
super().__init__()
self.updates = Queue()
class Watcher(Observable):
def run(self):
for i in it.count():
self.notify(i)
time.sleep(1)
class Worker(Observable, Observer):
def run(self):
while True:
task = self.updates.get()
self.notify((str(task), 'start'))
time.sleep(1)
self.notify((str(task), 'stop'))
class Supervisor(Observer):
def __init__(self):
super().__init__()
self._statuses = {}
def run(self):
while True:
status = self.updates.get()
print(status)
self._statuses[status[0]] = status[1]
# Do something based on status updates.
if status[1] == 'stop':
del self._statuses[status[0]]
watcher = Watcher()
worker = Worker()
supervisor = Supervisor()
watcher.subscribe(worker.updates)
worker.subscribe(supervisor.updates)
supervisor.start()
worker.start()
watcher.start()
然而,有很多变化是可能的,您可以检查最适合您的各种模式。
https://stackoverflow.com/questions/51253177
复制相似问题