gpt4 book ai didi

multithreading - 写入 BufferedWriter 的最佳 Scala 线程安全方式是什么?

转载 作者:行者123 更新时间:2023-12-04 04:26:49 24 4
gpt4 key购买 nike

我有一个简单的方法,将一行数据写入文件,然后是异步执行的新行。

  def writeToFile(bw: BufferedWriter, str: String) = {
bw.write(str)
bw.newLine
}
当我的程序运行时,由于调用的异步性质,我在文件中“混淆”了行。例如...说 writeToFile(bw, "foo") 异步执行 3 次我可能会得到:
正确的输出

foo

foo

foo


可能不正确的输出

foofoo

foo


我可以通过使用这样的同步方法来避免这种可能性:
  def writeToFile(bw: BufferedWriter, str: String) = synchronized {
bw.write(str)
bw.newLine
}
根据我的研究,我无法确定这在扩展我的应用程序方面有多“安全”。我能找到的唯一使用同步的例子是访问集合,而不是写入文件。我的应用程序是在 Play 中构建的!框架 2.4.2.

最佳答案

我个人会为每个 BufferedWriter 创建一个 akka actor,它将完全封装它。

import java.io.BufferedWriter
import akka.actor._
import playground.BufferedWriterActor.WriteToBuffer

object BufferedWriterActor {
val name = "BufferedWriterActor"
def props(bw: BufferedWriter) = Props(classOf[BufferedWriterActor], bw)

case class WriteToBuffer(str: String)
}

class BufferedWriterActor(bw: BufferedWriter) extends Actor {

def receive: Actor.Receive = {
case WriteToBuffer(str) =>
bw.write(str)
bw.newLine()
}
}

像这样使用它:
import akka.actor.{ActorSystem, Props}

object HelloWorld {
def main(args: Array[String]): Unit = {
val system = ActorSystem("mySystem")

// Share this actor across all your threads.
val myActor = system.actorOf(BufferedWriterActor.props(bw), BufferedWriterActor.name)

// Send messages to this actor from all you threads.
myActor ! BufferedWriterActor.WriteToBuffer("The Text")
}
}

这将在单个线程中链接对此缓冲区的所有调用。

关于 akka 及其 Actor 的更多信息在这里:

http://akka.io/

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

play 框架本身也使用 akka,所以你应该可以使用它的默认 ActorSystem,但我不记得具体是怎么用的,抱歉。

关于multithreading - 写入 BufferedWriter 的最佳 Scala 线程安全方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com