【问题标题】:Testing concurrent/parallel execution测试并发/并行执行
【发布时间】:2011-09-25 04:46:18
【问题描述】:

我目前正在为需求驱动的工作流编写一个小型框架。 API 现在很稳定,我正在努力改进测试。很容易证明计算是正确的(这是一个好的开始),但是,框架的主要兴趣是并行启动子任务(在需要和可能的时候)。

有没有办法自动测试两条不同的代码是否以并行/并发方式运行?我不喜欢依赖执行时间(加速)测量。

该框架是用 scala 编写的,并且很大程度上依赖于 Akka Futures。

编辑:

这是一个例子:

val foo = step {
  //... defines an arbitrary task
}

// Runs 5 times the code inside step foo
val foos = repeat( 5 )( foo )

我想确保foo中的代码被并行执行5次。

【问题讨论】:

    标签: testing scala concurrency akka


    【解决方案1】:

    如果不更改任务(即当您需要测试两个特定任务并行运行时),我看不出有什么方法可以做到这一点。但是,如果您可以更改任务,只需将参与者添加到系统中即可。让每个任务在开始或结束工作时都向这个actor发送消息。如果参与者连续收到两条Starting 消息,则这些任务应该并行运行(或至少在不同的线程中)。

    【讨论】:

    • 我喜欢这个想法,但是你确定actor邮箱中消息的绝对顺序吗?
    • @paradigmatic:akka.io/docs/akka/snapshot/scala/actors.html 似乎没有说明任何关于排序的事情,不幸的是,包括我希望任何参与者实现提供的保证。
    • 您可以在消息中使用时间戳,然后在测试结束时将消息排列在时间戳上并构建“事件时间线”..
    【解决方案2】:

    这个测试对我没有任何意义。在少于 5 个内核的计算机上,您无法获得 5 个并行度。您似乎正在测试我们已经在做的 Akka,所以只需放松并测试调度程序设置,以验证它何时运行它是否具有所需的效果。

    希望对你有帮助,

    干杯, √

    【讨论】:

    • 我不是在尝试测试 akka 调度程序是否工作,而是我是否能够启动任务并正确组合期货。我介绍了一些错误,这些错误使一些代码连续,我想确保这种情况永远不会再发生。 (顺便说一句:现在有超过 4 个内核的机器并不少见)
    • 那么问题可能是错误的,你是如何使代码顺序的?
    • 通过将 future 与 flatMap 结合起来,而无需提前触发执行(即,在内部为理解而创建的 future)。我想避免这种错误。
    • 啊,好吧,因为 flatMap 是“隐藏的”,所以在理解时很容易忽略这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多