我正在尝试在Rx的C ++ version中找出调度模型。
了解C#版本,其中有一个带有一个Schedule方法的简单接口; C ++版本似乎相当复杂,包括调度程序,工作程序和协调等。
对我来说,一个主要缺失的部分是线程池调度程序的实现,是否存在其他名称?我将如何实现自己?我应该在PPL(Windows)上面写吗?如果我需要一个序列化(类似于Actor)的观察者,我应该使用什么?偷看here和here可以证明这不是一项微不足道的任务。
这有助于获得关于该主题的某种概述,因为official文档是自动生成的并且仍然非常稀疏。
答案 0 :(得分:8)
是的,生成的文档是新的,调度尚未记录。
rxcpp v2中的调度程序基于RxJava使用的调度程序和工作程序构造(Eric Meijer参与其中) RxJava的文档将对调度程序和worker有一个解释。 rxcpp增加了可调度,协调和协调器。
scheduler
拥有now()
方法公开的时间轴。 scheduler
也是该时间轴中worker
的工厂。由于调度程序拥有时间轴,因此可以构建时间旅行的调度程序。 virtual-scheduler是测试调度程序的基础,它使用它来以毫秒为单位完成多秒测试。
worker
拥有时间轴的待处理schedulable
队列,并且具有生命周期。当达到schedulable
的时间时,运行schedulable
。队列维护插入顺序,以便当N schedulable
具有相同的目标时间时,它们按照它们插入队列的顺序运行。 worker
保证每个schedulable
在下一个schedulable
开始之前完成。当worker
的生命周期取消订阅时,所有待处理的schedulable
都将被丢弃。
schedulable
拥有一个函数,拥有一个工人和一生。当schedulable
的生命周期取消订阅时,将不会调用schedulable
函数。 schedulable
被传递给函数并允许函数重新安排自己或在同一个worker上安排其他东西。
新概念是协调和协调者。我添加了这些来简化运营商实现并在运营商实现中引入付费使用。具体来说,在Rx.NET和RxJava中,运算符使用原子操作和同步原语来协调来自多个流的消息,即使所有流都在同一个线程上(如UI事件)。默认情况下使用rxcpp中的identity_. . .
个协调,没有开销。 syncronize_. . .
和observe_on_. . .
协调分别使用互斥和队列到队列,以安全地交错多个流。
coordination
是coordinator
的工厂,有一个scheduler
。
coordinator
有一个worker
,是协调observable
,subscriber
和schedulable
函数的工厂。
所有采用多个流或及时处理的运营商(甚至是subscribe_on和observe_on)都采用协调参数,而不是调度程序。
以下是一些使用特定调度程序生成协调的提供函数。
还没有线程池调度程序。线程池调度程序需要依赖于线程池实现,因为我不希望编写线程池。我的计划是为Windows线程池和苹果线程池以及boost asio执行器池创建一个调度程序。要回答的一个问题是这些特定于平台的构造是应该存在于rxcpp repo中还是具有特定于平台的存储库。 / p>
欢迎贡献,意见和想法!