2013-05-19 50 views
2

我想使用Akka框架并发地写入多个文件,首先我创建了一个名为MyWriter的类写入文件,然后使用期货我称这个对象两次跳转2文件将为我创建,但是当我监视程序的执行时,它首先填充第一个文件,然后填充第二个文件(阻塞/同步)。如何使用期货与Akka的异步结果

问:我怎样才能使代码波纹管运行(无粘连/异步)

import akka.actor._ 
import akka.dispatch._ 
import akka.pattern.ask 
import akka.util.Timeout 

import scala.concurrent.Await 
import scala.concurrent.duration._ 
import scala.concurrent.Future 
import scala.concurrent.{ ExecutionContext, Promise } 
import ExecutionContext.Implicits.global 

class my_controler { 

} 

object Main extends App { 

    val system = ActorSystem("HelloSystem") 
    val myobj = system.actorOf(Props(new MyWriter), name = "myobj") 
    implicit val timeout = Timeout(50 seconds) 
    val future2 = Future { myobj ! save("lots of conentet") } 
    val future1 = Future { myobj ! save("event more lots of conentet") } 

} 

的MyWriter代码:

case class save(startval: String) 

class MyWriter extends Actor { 
    def receive = { 
    case save(startval) => save_to_file(startval) 
    } 

为什么代码不同时执行什么想法吗?

+0

如何定义'save'? –

+0

好吧,让我编辑我的问题,添加 – CruncherBigData

+4

请记住,硬盘不喜欢并行访问。他们放慢速度 - 很多。所以如果它们在同一个hd上,不要并行地写文件。还有其他人已经提到过,不要在未来包装与演员的沟通。 – SpiderPig

回答

4

你为什么要用?打电话给另外Future? Ask(?)无论如何返回Future,所以你在这里做的是围绕另一个Future包裹Future,我不是你想要做的surte。

我看到的第二个问题是您要发送两条消息给同一个actor实例,并且您期望它们并行运行。演员实例串行处理其邮箱。如果你想同时处理,那么你将需要你的两个角色实例。如果这就是你想要做的,那么只需启动FileWriter的另一个实例并发送第二条消息。

+0

你是绝对正确的,我正在实例化相同的对象,现在我创建了两个不同的对象,它并行工作。非常感谢。 – CruncherBigData

+0

还有一个问题,如果我想开始说100个fileWriter实例,那么最佳做法是什么? – CruncherBigData

+2

对于这种情况,我建议使用池式路由器,然后使用循环法或最小邮箱策略。让演员长久居住,坐在路由器后面,将消息分发给他们。查看关于路由器的文档,了解如何使其工作,但从创建点看,它看起来像这样:'system.actorOf(Props [MyWriter] .withRouter(RoundRobinRouter(100)),“filewriter”)' 。文档:http://doc.akka.io/docs/akka/2.1.4/scala/routing.html – cmbaxter