我一直在开发一个内部DSP应用程序(用于Groovy / Jython / JRuby的Java w / hooks,通过OSGi的插件,大量的JNI),数据流/图表样式,类似于纯数据和simulink 。我目前的设计是推模型。用户与某个源组件交互,导致它将数据推送到下一个组件,依此类推,直到结束块(通常是显示器或文件写入器)。这种设计存在一些独特的挑战,特别是当组件需要输入时。没有简单的方法来请求更多输入。我已经通过反馈控制流来缓解了一些这种情况,例如,FFT块可以广播它需要更多数据来源它的链块。我已经考虑过将组件的支持添加为推/拉/两者。
我正在寻找关于push vs pull vs both / hybrid的优点的回应。你之前做过这个吗?什么是“陷阱”?你是怎么处理的?这个问题有更好的解决方案吗?
答案 0 :(得分:2)
在大型产品中采用“主要拉动”方法的一些经验:
模型:节点构建1:N树,即每个组件(根除外)有1个父节点和1..N个子节点。数据几乎完全从父母流向儿童。更改通知可以来自树中的任何节点。
实施:通过发送节点的id和“生成”计数器通知所有叶子。 Leafs知道他们依赖哪个节点路径,因此他们知道他们是否需要更新。 (任何其他子节点更新算法也会这样做,事后看来可能更好)。
Leafs查询其父级以获取当前数据,以递归方式查询冒泡。包括生成计数器,因此起泡停止在始发节点处。
优点:
缺点:
一般而言:
当数据和处理层对UI一无所知时,Data-Pull“感觉”对我来说更具原生性。但是,它需要复杂的变更通知机制来避免“更新宇宙”。
Data-Push简化了增量更新,但前提是发件人非常了解接收者。
我没有使用其他型号的相似规模的经验,所以我无法真正提出建议。回想起来,我看到我主要使用拉力,这不是一件麻烦事。看到其他人的经历会很有趣。
答案 1 :(得分:0)
我在一个纯拉图像处理库上工作。它更适合于批量式操作,我们不需要处理动态输入,因此它似乎运行良好。 Pull特别适用于大型数据集和线程:我们线性扩展至至少32个CPU(取决于所评估的图形,当然,heh)。
我们有一个GUI,允许叶子是动态数据源(例如,提供帧的摄像机),并通过丢弃和重建图形的相关部分来处理它们。在我们的情况下这很便宜,所以开销不是那么高。