2011-09-24 91 views
3

我目前正在为需求驱动的工作流编写一个小框架。该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次。

回答

2

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

+0

我喜欢这个想法,但你肯定在演员邮箱中邮件的绝对排序的? – paradigmatic

+0

@paradigmatic:不幸的是,http://akka.io/docs/akka/snapshot/scala/actors.html似乎没有提到有关订购的任何内容,包括我期望任何actor实现提供的保证。 –

+2

您可以在邮件中使用时间戳,然后在测试结束时在时间戳上排列邮件并构建“事件时间线”。 – tuxSlayer

1

这个测试对我没有任何意义。在少于5个内核的计算机上,你不能得到5的并行性。看起来你正在测试我们已经在做的Akka,所以只需放松并测试调度程序设置,以验证它何时运行它就会有所需影响。

希望帮助,

干杯, √

+1

我并非试图测试akka调度员是否工作,而是如果我能够开始任务并正确地结合未来。我介绍了一些使某些代码连续的错误,并且我想确保这种情况不会再发生。 (顺便说一下:这些日子里有超过4个内核的机器并不少见) – paradigmatic

+0

那么问题可能是错误的,你是如何让代码顺序的? –

+0

通过将期货与'flatMap'相结合而不触发执行(即为了理解而创建的期货)。我想避免这种错误。 – paradigmatic