Rxcpp中的调度程序

时间:2015-05-17 20:58:43

标签: c++ threadpool system.reactive ppl rxcpp

我正在尝试在Rx的C ++ version中找出调度模型。

了解C#版本,其中有一个带有一个Schedule方法的简单接口; C ++版本似乎相当复杂,包括调度程序,工作程序和协调等。

对我来说,一个主要缺失的部分是线程池调度程序的实现,是否存在其他名称?我将如何实现自己?我应该在PPL(Windows)上面写吗?如果我需要一个序列化(类似于Actor)的观察者,我应该使用什么?偷看herehere可以证明这不是一项微不足道的任务。

这有助于获得关于该主题的某种概述,因为official文档是自动生成的并且仍然非常稀疏。

1 个答案:

答案 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_. . .协调分别使用互斥和队列到队列,以安全地交错多个流。

coordinationcoordinator的工厂,有一个scheduler

coordinator有一个worker,是协调observablesubscriberschedulable函数的工厂。

所有采用多个流或及时处理的运营商(甚至是subscribe_on和observe_on)都采用协调参数,而不是调度程序。

以下是一些使用特定调度程序生成协调的提供函数。

  • identity_immediate()
  • identity_current_thread()
  • identity_same_worker(worker w)
  • serialize_event_loop()
  • serialize_new_thread()
  • serialize_same_worker(worker w)
  • observe_on_event_loop()
  • observe_on_new_thread()

还没有线程池调度程序。线程池调度程序需要依赖于线程池实现,因为我不希望编写线程池。我的计划是为Windows线程池和苹果线程池以及boost asio执行器池创建一个调度程序。要回答的一个问题是这些特定于平台的构造是应该存在于rxcpp repo中还是具有特定于平台的存储库。 / p>

欢迎贡献,意见和想法!