代码之家  ›  专栏  ›  技术社区  ›  Roma Gafiyatullin

阿克卡河。组合物化值。需要绘制未来地图。要使用哪个ExecutionContext/Dispatcher?

  •  1
  • Roma Gafiyatullin  · 技术社区  · 7 年前

    鉴于:

    • AtoB: GraphStageWithMaterializedValue[A, B, Future[AtoBRuntimeApi]] ;

    • BtoC: GraphStageWithMaterializedValue[B, C, Future[BtoCRuntimeApi]] .

    通缉犯: AtoC: GraphStageWithMaterializedValue[A, C, Future[AtoCRuntimeApi]] .

    在我的特殊情况下,实现起来非常方便 AtoCRuntimeApi 就两者而言 AtoBRuntimeApi BtoARuntimeApi .

    所以我想定义一下 AtoCRuntimeApi公司 case class AtoCRuntimeApi(a2b: AtoBRuntimeApi, b2c: BtoCRuntimeApi) ;

    并将新的复合阶段定义为 stageAtoB.viaMat(stageBtoC)(combineIntoAtoC) 哪里 combineIntoAtoC: (Future[AtoBRuntimeApi], Future[B2CRuntimeApi]) => Future[AtoCRuntimeApi] .

    显然 combineIntoAtoC 需要的某些实例 ExecutionContext 为了描绘未来。

    问题:在所描述的案例中,我应该使用什么执行上下文?

    选择,我宁愿避免:

    • 在当前可用的实例中烘焙(阶段组成时),如果执行上下文变得不可用,“蓝图”将无法安全实现;

    • ExecutionContext.global 嗯,这是全球性的。使用它似乎大错特错(可能,每次实现一次也没什么大不了的)。

    最需要的执行上下文是作为materializer属性可用的上下文( mat.executionContext ). 但我无法在联合收割机功能中访问它。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Vladimir Matveev    7 年前

    在这种情况下,我通常使用actor系统上下文,这在默认情况下确实可以从物化器中引用。不过,作为一般解决方案,您可以将执行上下文传递给使用隐式参数构造流图的任何函数:

    def makeGraph(...)(implicit ec: ExecutionContext): RunnableGraph = {
      def combineIntoAtoC(...) = ...  // uses ec implicitly
    }
    

    这允许您推动关于使用调用堆栈的上下文的决策。在适当的级别上,肯定会有某种访问actor系统调度器的权限。

    我之所以喜欢使用actor系统的调度程序而不是全局调度程序,是因为它减少了依赖关系的表面-在这种情况下,所有执行上下文都来自一个源,如果需要,您知道如何配置它们。