Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过系统推送数据的软件范例_Python_Software Design - Fatal编程技术网

Python 通过系统推送数据的软件范例

Python 通过系统推送数据的软件范例,python,software-design,Python,Software Design,tl dr:如果要使用的正确软件设计模式是推/拉管道模式,我希望您提供反馈。 详情: 假设我有几个软件算法/模块,用于处理进入软件系统的数据: [Download Data] --> [Pre Process Data] --> [ML Classification] --> [Post Results] 下载数据块只是游荡到午夜新数据可用时,然后下载新数据。预处理数据只是闲逛,直到出现新的可用下载数据,然后对数据进行预处理。机器学习(ML)分类块只是游荡,直到有新的数据可用

tl dr:如果要使用的正确软件设计模式是推/拉管道模式,我希望您提供反馈。

详情: 假设我有几个软件算法/模块,用于处理进入软件系统的数据:

[Download Data] --> [Pre Process Data] --> [ML Classification] --> [Post Results]
下载数据块只是游荡到午夜新数据可用时,然后下载新数据。预处理数据只是闲逛,直到出现新的可用下载数据,然后对数据进行预处理。机器学习(ML)分类块只是游荡,直到有新的数据可用于分类,等等

整个系统似乎是事件驱动的,我认为完全符合推/拉模式

[下载数据]块将是生产者?消费者将是所有后续块,但[Plot Results]除外,它将是一个结果收集器

Producer = pull
Consumer = pull then push
result collector = pull
我在python框架内工作。这个实现看起来很理想:

如果我错过了这里的要点,我完全愿意使用推/拉以外的其他软件模式。我也愿意使用另一种回购协议


提前感谢您在上述方面的帮助

我做过很多次类似的管道,非常喜欢把它分成这样的块。为什么?主要用于从任何错误中自动恢复。如果有什么东西被耽搁了,它将在下个小时自动恢复。若有什么东西需要在管道中间修复,那个么修复它并命名它,这样它就可以在下一个周期中得到修复。(事实上,更小的模块更容易设计、构建和测试)

例如,您的
[下载数据]
应该每小时运行一次以查找等待的数据:如果没有,则返回睡眠;如果有的话,将其下载到一个文件中,文件名包含时间戳和状态:
2020-0103T2153.download.json
[预处理数据]
应每小时运行一次,以查找名为
*.download.json的文件:如果没有,请返回睡眠;如果有一个或多个,则以递增的时间戳顺序预处理每个,并将输出到
.pre-processed.json
。等,等每一步

这样做意味着可能会自动恢复计划外事件,除非查看日志文件,否则没有人会知道(您应该记录每个事件,以便知道发生了什么)。晚上容易入睡:)

在这些场景中,事件通过crontab驱动这只是一天中的某个时间。当“醒来”时,管道中的每一步都只是看看是否有工作在等着它。试图让文件创建事件启动事情并不简单,特别是当您需要重新启动事情(需要重新创建文件)时


我不会使用消息队列,因为当您必须在传入消息到达时处理它们时,消息队列更复杂,也更适合。您的案例是更简单的批处理文件处理,所以请保持简单,晚上睡觉。

您的管道将保持这种线性还是变得更分支?因为如果是前者,我认为你的建议太过分了。这是一个非常宽泛的话题。话虽如此,推/拉是消息传递的有用模式,即小数据传输,如发送作业已完成的信号。您的用例听起来像是一个典型的数据/工作流管道,我们有许多现有的解决方案。如果可以,就使用它们,避免重复发明轮子。如果不只是看一看,以获得更好的理解。