我该怎么办数据流(管道和过滤器,流处理,基于流量的)用C? 而不是与UNIX管道。
最近,我碰上了stream.py 。
流是用流水线机制,使数据流的编程和容易并行化iterables。
我们的想法是采取函数的输出,轮流可迭代到另一个迭代和插头,作为另一种这样的功能的输入。 虽然你已经可以做到这一点使用功能组成,该包通过重载>>运营商提供一个优雅的符号来表示它。
我想复制这种功能在C.我特别喜欢超载的简单版本>>
操作,以避免函数组合混乱。 维基百科指出这暗示从1990年的一个新闻组帖子。
为什么C 2 因为我希望能够做到这一点的微控制器和C扩展其他高级语言(最大,钯*,Python的)。
*(具有讽刺意味的考虑到最大和Pd被写了,在C,专门为此目的 - 我在寻找的东西准系统)
我知道,这不是一个很好的答案,但你应该让自己的简单数据流框架。
我写了一个原型DF服务器(连同我的朋友),其中有几个未执行的功能:不过它只能传递消息整数和触发数据,并且它不支持paralellism。 我刚刚跳过这项工作:在组件的生产商端口具有函数指针消费端口,这是建立在初始化列表,他们调用它(如果列表不为空)。 所以,当一个事件触发,该组件进行树形步行通数据流图。 当他们用整数和触发器的工作,它的极端快。
另外,我写了一个奇怪的成分,它有一个消费者和一个生产者端口,它只是简单地将数据通 - 但在另一个线程。 这是消费者日常很快结束,因为它只是把数据和设置标志的生产方线程。 肮脏的,但它适合我的需要:它分离树走一个漫长的过程。
所以,你可能会认识到,它的快速任务,其中图形大小并不重要,低流量的异步系统。
可惜的是,你的问题与我的不同点多,就像一个多数据流系统能够与人不同,你需要一个同步,paralell,流处理解决方案。
我认为,在DF服务器的最大的问题是调度员。 并发,冲突,线程,优先......正如我所说,我只是跳过这个问题,没有解决。 你应该跳过了这一点。 而且你也应该跳过其他问题。
调度员
在同步DF架构的情况下,所有组件都必须按周期运行一次,除非特殊情况。 他们有一个简单的前提:可输入数据? 所以,你应该只扫描直通组件,并将它们传递给一个自由调用程序线程,数据是否可用。 处理所有这些之后,你将有N个剩余成分,还没有处理。 你应该再次处理名单。 第二处理后,您将具有M个remainings。 如果N == M时,循环结束。
我觉得某种同样的东西会工作,如果部件的数量低于只有100。
捆绑
是的,结合最好的办法是可视化编程。 直至完成编辑,配置类似的代码应该使用insetad,是这样的:
// disclaimer: not actual code
Component* c1 = new AddComponent();
Component* c2 = new PrintComponent();
c2->format = "The result is %d\n";
bind(c1->result,c2->feed);
这很容易写,好读,其他的愿望是什么?
信息
你应该通过组件的端口之间的纯原始数据包。 你只需要绑定,它包含对生产者和消费者港口指针的列表,并包含处理标志,其中的“调度员”的用途。
调用问题
问题是,生产商不应该叫消费者端口,但是组件; 所有成分(类)的变量和点火都是在组件中。 因此,生产者应直接调用组件的共同切入点,通过消费者的ID给它,或者它应该调用的端口,这应该调用它所属的组件的任何方法。
所以,如果你能有一些限制住,我说了,先走了,写你的精简版框架。 这是一个很好的工作,但写小部件,看看,多么聪明,他们可以连在一起制作的应用程式是最终的乐趣。
如果您还有其他问题,随便问,我经常在这里扫描“数据流”的关键字。
可能的话,你可以计算出你的程序更简单的dataflowish模型。
我不知道这样的目的的任何库。 我的朋友实施了versity为实验室分配类似的东西。 这种系统的主要问题是低性能(如果在长管道线功能短小非常糟糕),并执行调度(检测死锁,促进优先,以避免管道缓冲区过载)潜在需求。
从我有类似的数据处理经验,错误处理是相当沉重的负担。 由于管道中的功能知之甚少的情况下的(故意的,可重用性),它们不能产生有意义的错误消息。 一个可以实现在线错误处理 - 传球失误沿管路的数据 - 但是这将需要特殊处理所有的地方,特别是在输出,因为它是不可能的流关联到什么样的输入错误相对应。
考虑到方案的已知的性能问题,这是我很难想象如何将适合的微控制器。 性能方面,没有什么比一个普通的功能:可以通过数据管道线的每个路径创建一个函数。
也许你可以找一些Petri网实现(仿真或代码生成器),因为它们是流的理论基础之一。
这是酷: http://code.google.com/p/libconcurrency/
轻量级并发库为C,设有对称协程作为主控制流程的抽象。 图书馆是类似于国家线程,但使用协程,而不是绿色线程。 这简化了过程间的电话和在很大程度上消除互斥量和信号量信令的需要。
最终,协程的调用也将能够内核线程之间安全地迁移,所以可以实现可扩展性比。因此国家线程,这是故意单线程高得多。
该库由Douglas W. Jones的‘最低限度的用户级线程包’的启发。 在SVN主干伪平台中立的探测算法是从他的代码的。
还有一个更安全,更便携的协同程序基于堆栈的复制,这是在C.复制便携式延续启发SIGFPE的页面实现更便携,比堆栈开关灵活,使复制与开关的竞争正在研究。