首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有工作进程的python设计模式队列

具有工作进程的python设计模式队列
EN

Stack Overflow用户
提问于 2018-07-10 04:00:17
回答 1查看 1.2K关注 0票数 0

我目前正在做一个包含三个组件的项目,

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

我想要实现的是:

  • 观察者,当发生更改时,向工作进程发送一个字符串(将作业添加到工作进程的队列中)。
  • 工作进程有一个作业队列,并且永远在其队列上工作。
  • 现在,我希望可以运行python脚本来检查工作进程的状态(活动作业的数量、错误等)

我不知道如何使用python来实现这一点,因为要使用哪个组件以及如何链接这三个组件。

我认为作为一个单例工作者,观察者将作业添加到队列中,但1)我无法编写工作代码,2)我如何才能适应检查器?

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

感谢您的建议

EN

回答 1

Stack Overflow用户

发布于 2018-07-10 04:38:28

我会使用某种observer patternpublish-subscribe pattern。对于前者,您可以使用例如ReactiveXPython version。但对于更基本的示例,让我们继续使用Python核心。例如,程序的某些部分可以订阅工作进程,并通过队列从进程接收更新。

代码语言:javascript
复制
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()

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51253177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档