带有工作人员的python设计模式队列

时间:2018-07-09 20:00:17

标签: python shell queue software-design

我目前正在从事一个涉及三个组成部分的项目

检查目录,工作程序和命令行界面中的更改的观察者。

我想要实现的是:

  • 观察者,当发生更改时,向工作人员发送一个字符串(将工作添加到工作人员的队列中)。

  • 工人有很多工作,并且永远在他的队列中工作。

  • 现在,我希望可以运行python脚本来检查工作程序的状态(活动作业的数量,错误等)

在使用哪个组件以及如何链接这三个组件方面,我不知道如何使用python实现。

虽然我是一个单身工人,但观察者将作业添加到队列中,但1)我无法编写工作代码,并且2)如何使检查器适合?

我想到的另一种解决方案可能是来自有队列的父亲的多个子进程,但我有点迷路...

谢谢您的建议

1 个答案:

答案 0 :(得分:0)

我会使用某种observer patternpublish-subscribe pattern。对于前者,您可以使用Python version中的ReactiveX。但是,对于更基本的示例,让我们继续使用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()

但是可能有很多变化,您可以检查最适合您的各种模式。