Scala 在单独的执行上下文中运行断言的安全性

Scala 在单独的执行上下文中运行断言的安全性,scala,crash,future,assertion,Scala,Crash,Future,Assertion,不同的执行上下文彼此之间的隔离程度如何?假设我们有两个执行上下文ec1和ec2,这两个上下文都用于实现某个用户旅程的相同代码路径。比如说,如果饥饿和崩溃开始在ec2中发生,那么ec1会不会保持不受影响 例如,考虑下面的场景,我们希望通过在“代码< >未来< /代码> 中运行断言,确保用户只收取一次费用。 chargeUserF andThen { case _ => getNumberOfChargesF map { num => assert(num == 0) }

不同的执行上下文彼此之间的隔离程度如何?假设我们有两个执行上下文
ec1
ec2
,这两个上下文都用于实现某个用户旅程的相同代码路径。比如说,如果饥饿和崩溃开始在
ec2
中发生,那么
ec1
会不会保持不受影响

例如,考虑下面的场景,我们希望通过在“代码< >未来< /代码>

中运行断言,确保用户只收取一次费用。
chargeUserF andThen { case _ => 
  getNumberOfChargesF map { num => assert(num == 0) }
    .andThen { case Failure(e) => logger.error("User charged more than once! Fix ASAP!", e)  } 
}


这里
getNumberOfChargesF
不是满足用户请求所必需的,它只是一个次要问题,我们在数据库被
chargeUserF
变异后断言它的预期状态。因为没有必要,我不太愿意将它添加到主业务逻辑中,因为我担心它会以某种方式破坏主逻辑。如果我在与chargeUserF使用的执行上下文不同的执行上下文上运行
getNumberOfChargesF
,我是否可以假设由
getNumberOfChargesF
引起的饥饿、阻塞等问题不会影响主业务逻辑

每个执行上下文都有自己的线程池,所以,是的。。。有点。 它们是“独立”的,如果一个线程用完了,另一个线程可能会继续运行,但是,它们使用相同的资源(cpu),因此如果一个线程用完了,另一个线程显然会受到影响

它们还受到彼此副作用的影响。例如,您编写代码的方式,
chargeUser
getNumberOfCharges
是并行的,并且没有人说哪一个将首先完成,因此,如果我猜对了语义,则费用的数量可能会相当随机地变成0或1,取决于前一个未来是否已完成