我被这个Jactor框架坑了一周,特此写下以警醒后人,如果有错请指出

abcbuzhiming 发布于 2014/09/24 00:02
阅读 2K+
收藏 0

我最开始注意到Actor模式就是因为这个模式被称为在多线程下可简化并发开发模型的难度,且从akka框架看到的actor模型的定义如下:

  • 系统中的所有事物都可以扮演一个Actor
  • Actor之间完全独立
  • 在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
  • 消息传递是非阻塞和异步的,其机制是邮件队列(mail-queue)
  • 所有消息发送都是并行的
然后我看到这个框架据说是java下的actor模式的实现,于是我就拿来试了,为了防止是我自己水平不高,我专门去它的官网下载的官方范例,并把他的文档都仔细看了一遍,然后开始试用,结果我发现了一个极度要命的地方:

他向一个Actor发消息,引发该Actor行为的这个过程是完全阻塞的,不要笑,我反复试验过,它根本实现不了,send以后立即返回处理其它事情这个功能,也许单纯它向Actor发送消息的速度很快,但是这有毛用,之所以多线程下编程情况复杂,就是因为某些线程执行的命令需要耗费很多的时间,结果你这send过程是阻塞的,那等于我自己还得手动去Actor内部起线程,这不搞笑吗。说好了消息都是并行的而且无阻塞呢,说好了你的Actor是有队列的呢?

总之这玩意根本达不到Akka的效果,主页上还说这是akka的纯java实现,扯淡嘛。亏我还以为它真能实现Akka那种功能

加载中
0
大萌王朝首席槽点师
大萌王朝首席槽点师

很正常啊。actor模型有基于线程和事件的两种调度方式,基于线程的调度为每个actor分配一个线程,在接收消息时,如果当前actor的mailbox为空,则会阻塞当前线程。 

很明显,你使用了基于线程的api。

骚年,谦虚点多学习学习,不要浮躁了

0
abcbuzhiming
abcbuzhiming

引用来自“兮风古道”的评论

很正常啊。actor模型有基于线程和事件的两种调度方式,基于线程的调度为每个actor分配一个线程,在接收消息时,如果当前actor的mailbox为空,则会阻塞当前线程。 

很明显,你使用了基于线程的api。

骚年,谦虚点多学习学习,不要浮躁了

你说当前actor的mailbox为空的意思是什么?如果你是指的线程,我给每个actor都有一个独占的mailbox,不可能是空的
abcbuzhiming
abcbuzhiming
回复 @兮风古道 : 贴 了
大萌王朝首席槽点师
大萌王朝首席槽点师
不争论了, 你贴出你的代码
0
abcbuzhiming
abcbuzhiming

补充,我今天又测试了一天,终于搞明白了异步发送是怎么弄的,但是同时也确认了一点,Jactor不允许在一个非Actor的内部向一个Actor发起异步消息

public class TestActor extends JLPCActor {

	public void processeRequest(Request request, final RP<String> rp)
            throws Exception  {
        System.out.println("Hello TestActor");
        AsyncActor asyncActor = new AsyncActor();
        asyncActor.initialize(getMailboxFactory().createAsyncMailbox());
        RP prp = new RP() {
            boolean pending = true;
             @Override
             public void processResponse(Object response) throws Exception {
                     System.out.println("AsyncActor执行完毕");
                     rp.processResponse("1+2");
                 
             }

         };
         (new Delay(1000)).send(this, asyncActor, prp);
         System.out.println("异步执行成功");
    }



send方法的第一个参数必须有,就是来源Actor,用null就出错,这影响了它的使用范围
Open Declaration Object org.agilewiki.jactor.lpc.Request.send(JAFuture future, TestActor targetActor) throws Exception

这个方法是完全同步的,没有办法弄成异步,顺便说一下,还有一个sendevent也是同步方法



0
远志
远志
作者文档中有说J Actor有个问题的,所以他现在主要精力开发JActor2,不知说的是不是就是这个问题。
0
星爷
星爷
不用研究这个了 ,当年开发游戏的时候还拿来研究一番。不过感觉代码写的有点坑爹,不敢用。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部