通过scala单例对象进行并发处理

时间:2014-08-10 22:32:05

标签: multithreading scala singleton-methods

我试图在功能测试中构建一个简单的编排引擎,如下所示:

object Engine {
  def orchestrate(apiSequence : Seq[Any]) {
    val execUnitList = getExecutionUnits(apiSequence) // build a specific list
    schedule(execUnitList) // call multiple APIs
  }

在underneath中调用的方法(getExecutionUnits和schedule)中,我应用的模式是我逐步构建一个列表(因此,不是val而是var),迭代列表并调用sepcific API的模式。并在每个上运行一些自定义验证。

我知道scala中的一个对象有点像一个单例(所以在我的例子中只有一个Engine实例)。如果我期待100次同时调用协调方法,我想知道这是否是一个合适的模式。我没有管理Engine对象中的任何其他内部变量,我只是简单地对方法中提供的参数进行操作。假设调度方法可能需要10秒钟,我担心并发访问时的行为。如果client1,client2和client3同时调用此方法,那么2个客户端是否会排队并阻止当前正在处理的客户端?

是否有更安全的惯用方法来处理用例?你是否建议使用演员来结束" orchestrate"处理并发请求的方法?

编辑:为了澄清,2个方法(getExecutionUnits和schedule)绝对必要并按顺序调用。此外,调度方法依次调用多个API(1到10之间的任何位置),重要的是它们也按顺序执行。截至目前,我有一个简单的for循环,一次解决1 Api,等待响应,然后在适当的情况下移动到下一个。

1 个答案:

答案 0 :(得分:2)

  

我没有管理Engine对象中的任何其他内部变量,而我只是根据方法中提供的参数进行操作。

如果您在Engine中使用任何变量,那么这不会起作用。但是,根据您的描述,您似乎并不知道:getExecutionUnits方法中存在局部变量,并且(可能)schedule中的局部变量,其初始化为{{的返回值1}}。这种情况应该没问题。

  

如果client1,client2和client3同时调用此方法,2个客户端是否会排队并被阻止我正在处理的当前客户端?

不,如果你没有添加任何同步(如果引擎本身没有状态,你不应该)。

  

你是否建议使用演员来结束" orchestrate"处理并发请求的方法?

如果将其包装在一个actor中,则在引擎处理一个请求时,阻塞等待。