当前位置: 首页 > 知识库问答 >
问题:

在gatling中使用scala迭代器时的并发错误

狄法
2023-03-14

我正在使用gatling来运行负载测试。我不是gatling或scala专家,但在我看来,这个特定的问题可能更多地与scala(和Akka)相关,而不是与gatling本身相关。我将从最后开始:当在不太强大的机器上高负载运行时,我偶尔会得到这样的错误:

Iterator.continually([some collection]).flatten

其中[some collection]是我试图循环遍历的集合。当许多并发线程试图访问以这种方式定义的迭代器时,它是否偶尔会失败?有没有更好的方法创建一个循环迭代器,也是线程安全的?

正如下面的“save”方法创建的租户对象(实际上,这里有更多的代码填充由get方法检索的集合,因此它实际上从不为空):

import io.gatling.core.Predef._

object Tenants {
  type TenantKeys = Map[String, Map[String, String]]
  val key = "tenants"
  val elementKey = "tenant"
  var tenants: Iterator[Map[String, String]] = Iterator(Map[String, String]())

  def get(session: Session): TenantKeys = {
    session(key)
      .asOption[TenantKeys]
      .getOrElse(Map[String, Map[String, String]]())
  }

  def save(session: Session): Session = {
    val mapped = get(session).map(_._2).toSeq
    tenants = Iterator.continually(mapped).flatten
    session
  }
}

共有1个答案

高森
2023-03-14

你所做的不能简单地起作用。这不是Scala的问题,而是并发编程的问题。就像Java迭代器一样,Scala迭代器不是线程安全的。

使用Gatling的feed(),这是线程安全的。

 类似资料:
  • null 一些示例输出数据: *编辑:工作的scala代码行:

  • 迭代器不是集合,而是逐个访问集合元素的方法。 iterator it上的两个基本操作是next和hasNext 。 对it.next()调用将返回迭代器的下一个元素并提升迭代器的状态。 您可以使用Iterator的it.hasNext方法找出是否有更多元素要返回。 “逐步”迭代器返回的所有元素的最简单方法是使用while循环。 让我们按照以下示例程序进行操作。 例子 (Example) objec

  • 问题内容: 我从下面的代码中获得,我可以找到原因。我可以成功地从csv文件读取数据,并创建一个名为课程列表的arraylist。那么我需要将其排序到一个数组列表,该数组的每个单元格都包含相同课程(名称相似的课程)的数组列表。但是当我运行它时会生成ConcurrentModificationException,我不明白为什么… 这是我的CourefileSorterclass: 问题答案: 将它们分

  • 主要内容:实例,查找最大与最小元素,实例,获取迭代器的长度,实例,Scala Iterator 常用方法Scala 集合 Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。 迭代器 it 的两个基本操作是 next 和 hasNext。 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。 调用 it.hasNext() 用于检测集合中是否还有元素。 让迭代器 it 逐个返回所有元素最简单的方法是使用 while 循环: 实例 object T

  • Scala 集合 Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。 迭代器 it 的两个基本操作是 next 和 hasNext。 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。 调用 it.hasNext() 用于检测集合中是否还有元素。 让迭代器 it 逐个返回所有元素最简单的方法是使用 while 循环: object Test

  • 我有一个顺序数据源,表示为简单迭代器(或流)。数据相当大,不适合内存。此外,源代码可以遍历一次,并且获取成本很高。该源用于一些重过程(黑盒),该过程将迭代器(或流)作为其参数来使用线性数据。好的,很简单。但如果我有两种不同的消费程序,我该怎么办??正如我所说的,我不想将输入数据吸入类似列表的集合中。我也可以从一开始就重读源代码两次来完成我的任务,但我不喜欢这样,因为这样做没有效果。如果事实上我需要