C语言库中的数据流

如何在C中执行数据流(管道和filter,流处理,基于流)? 而不是使用UNIX管道。

我最近遇到了stream.py 。

流是具有流水线机制的迭代,以实现数据流编程和简单的并行化。

我们的想法是获取一个函数的输出,该函数将一个iterable转换为另一个iterable并将其作为另一个这样的函数的输入插入。 虽然您已经可以使用函数组合执行此操作,但此包通过重载>>运算符为其提供了优雅的表示法。

我想在C中复制这种function的简单版本。我特别喜欢>> operator的重载以避免函数组合乱。 维基百科在1990年的一篇Usenetpost中指出了这一暗示 。

为何选择C? 因为我希望能够在微控制器和其他高级语言(Max,Pd *,Python)的C扩展中实现这一点。

*(具有讽刺意味的是Max和Pd是用C编写的,特别是为了这个目的 – 我正在寻找一些准系统)

我知道,这不是一个好的答案,但你应该制作自己的简单数据流框架。

我编写了一个原型DF服务器(和我的一个朋友一起),它有几个未实现的function:它只能传递消息中的Integer和Trigger数据,并且它不支持并行。 我刚刚跳过这项工作:组件的生产者端口有一个指向消费者端口的函数指针列表,这些指针在初始化时设置,并且它们调用它(如果列表不为空)。 因此,当事件触发时,组件执行数据流图的树状漫游。 当他们使用整数和触发器时,它非常快。

另外,我写了一个奇怪的组件,它有一个消费者和一个生产者端口,它只是简单地传递数据 – 但在另一个线程中。 它的消费者例程快速完成,因为它只是放入数据并为生产者端线程设置标志。 很脏,但它符合我的需要:它分离了树木漫步的漫长过程。

因此,正如您可能认识到的那样,它是用于快速任务的低流量异步系统,其中图形大小无关紧要。

不幸的是,您的问题与我的问题不同,就像许多数据流系统可能不同,您需要一个同步,并行,流处理解决方案。

我认为,DF服务器中最大的问题是调度程序。 并发,冲突,线程,优先级…正如我所说,我刚刚跳过问题,没有解决。 你也应该跳过它。 你也应该跳过其他问题。

调度员

在同步DF架构的情况下,除特殊情况外,所有组件每个周期必须运行一次。 它们有一个简单的前提条件:输入数据是否可用? 因此,如果数据可用,您应该只扫描组件,并将它们传递给空闲的调用程序线程。 处理完所有这些后,您将拥有N个未处理的剩余组件。 您应该再次处理列表。 在第二次处理之后,您将剩余M个。 如果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传递给它,或者它应该调用端口,该端口应该调用它所属的组件的任何方法。


所以,如果你能忍受一些限制,我会说,继续,写下你的精简框架。 这是一个很好的任务,但是编写小组件,看看,他们如何聪明地连接在一起构建一个优秀的应用程序是最终的乐趣。

如果您还有其他问题,请随时查询,我经常在此处扫描“dataflow”关键字。

可能,您可以为您的程序找出更简单的数据流模型。

我不知道有任何图书馆用于此目的。 我的朋友实施了类似于实验室任务的东西。 这种系统的主要问题是性能低(如果长管线中的function很小,则非常糟糕)并且可能需要实现调度(检测死锁并提高优先级以避免管道缓冲器过载)。

根据我在类似数据处理方面的经验,error handling非常繁琐。 由于管道中的函数对上下文知之甚少(故意,为了可重用性),因此无法产生合理的错误消息。 可以实现内联error handling – 将错误传递给管道作为数据 – 但这需要在整个地方进行特殊处理,尤其是在输出上,因为流不可能与错误对应的输入相关联。

考虑到该方法的已知性能问题,我很难想象它将如何适合微控制器。 在性能方面,没有什么比普通function更好:可以通过数据管道为每条路径创建一个function。

可能你可以寻找一些Petri网实现(模拟器或代码生成器),因为它们是流的理论基础之一。

这很酷: http : //code.google.com/p/libconcurrency/

用于C的轻量级并发库,以对称协程作为主要控制流抽象。 该库类似于State Threads,但使用协同程序而不是绿色线程。 这简化了过程间调用,并且在很大程度上消除了对信令的互斥和信号量的需要。

最终,协程调用也能够在内核线程之间安全地进行迁移,因此可实现的可伸缩性远远高于State Threads,后者是故意的单线程。

这个库的灵感来自Douglas W. Jones的“最小用户级线程包”。 svn trunk上的伪平台中立探测算法是从他的代码中派生出来的。

基于堆栈复制的还有更安全,更便携的协程实现,其灵感来自sigfpe关于C中便携式延续的页面。复制比堆栈切换更加便携和灵活,并且正在研究使复制与切换竞争。