actor 内最好不要阻塞
1. 在使用 akka cluster singleton 时,我需要知道被创建的 singleton proxy 的 actorRef,通过绝对路径加 actorSelection 方法,应该很容易得到此 actor 的 actorRef
main() {
system.actorOf(ClusterSingletonManager.props(Master.props(Duration(99, "second")), "active",
PoisonPill, None), "master")
context.system.actorSelection("user/master/active").resolveOne(4 second).await ! ParentGreeting
}
上面的程序会报异常,actor not found
但是对于普通的 actor,却没有问题
val actorRef: ActorRef = system.actorOf(Master.props(10 second), "standalone") actorRef ! ParentGreetings
不知道原因
2.
对于1,我们假设 singleton actor 已经被创建,在 actor 内部获取自己的 actorRef
val core1: ActorRef = context.system.actorSelection("/user/master").resolveOne(Duration(10, "second")).await
val core2: ActorRef = context.system.actorSelection("/user/master/active").resolveOne(Duration(10, "second")).await
core1 成功得到(core1 是 clusterSingletonManager),core2 报错
3.
resolveOne 返回的是 Future[ActorRef],那么在 actor 内部尝试异步的方法
context.system.actorSelection("user/master/active").resolveOne(4 second).map(actor => actor ! ParentGreetings)
成功得到 actorRef 并且发送消息
解释:
对于2,3 我觉得可以理解成,resolveOne() 发送的 activity 消息给 singleton actor 后阻塞在那里,此次阻塞的不仅是这个语句,actor 自己也被阻塞了,它无法给自己再发一个消息,告诉自己的 activityId 信息,因此 resolveOne.await 等待 4 秒后,超时异常,actor not found 异常。
这种解释或许有道理,但是我觉得可能是错的,首先,我用的是 context.system,而不是 context 阻塞的应该不是当前 actor,曾经在stackoverflow 上看到过这个问题。其次,main 里的 resolveOne.await 总不会阻塞 actor 了吧,但它依然没有找到
actor 内最好不要阻塞的更多相关文章
- Akka简介与Actor模型
Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 Akka的核心就 ...
- akka框架——异步非阻塞高并发处理框架
akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...
- Akka简介与Actor模型(一)
前言...... Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 ...
- C#使用Process调用批处理阻塞问题
PS:又见到熟悉的C#代码了,好开心,哈哈哈.这次又跳坑了,好不容易才爬起来. 公司有自己开发的一套Submit.Compile.Publish的生命周期系统. 在Compile时,需要调用外部的 ...
- java并发之非阻塞算法介绍
在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的. 为了更好的理解阻塞算 ...
- 《通过C#学Proto.Actor模型》之Behaviors
Behaviors就是Actor接收到消息后可以改变处理的方法,相同的Actor,每次调用,转到不同的Actor内方法执行,非常适合按流程进行的场景.Behaviors就通过在Actor内部实例化一个 ...
- Scala学习之路 (十)Scala的Actor
一.Scala中的并发编程 1.Java中的并发编程 ①Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要. ②Java中的并发编程是基于共享数据和加锁的一种机制,即会 ...
- java阻塞队列之LinkedBlockingQueue
LinkedBlockingQueue是BlockingQueue中的其中一个,其实现方式为单向链表,下面看其具体实现.(均为JDK8) 一.构造函数 在LinkedBlockingQueue中有三个 ...
- 29、Java并发性和多线程-非阻塞算法
以下内容转自http://ifeve.com/non-blocking-algorithms/: 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在 ...
随机推荐
- 虚拟机搭建和安装Hadoop及启动
马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...
- [Beego模型] 四、使用SQL语句进行查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- makefile中的shell编程注意点
参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是 ...
- Detour3.0 win7 64bit下的安装
最近在做API hook相关的东西,用了inline hook后感觉不错,但是查找资料发现inline hook并不稳定 inline hook 的原理是在系统访问一个函数的时候先替换原函数入口处的内 ...
- phpmyadmin更改密码
- caffe solver 配置详解
caffe solver通过协调网络前向推理和反向梯度传播来进行模型优化,并通过权重参数更新来改善网络损失求解最优算法,而solver学习的任务被划分为:监督优化和参数更新,生成损失并计算梯度.caf ...
- sublime text2 插件 - ctags的使用
第1步:安装Ctag.exe文件 1.下载ctags程序,下载地址:http://pan.baidu.com/share/link?shareid=2930217876&uk=20133352 ...
- LiteIDE 在 Windows 下为 Go 语言添加智能提示代码补全
本文以 Windows 7 64 位为环境,go1.4.2.windows-amd64 和 liteidex27.2.1.windows-qt5 为例. 成功搭建开发环境后,发现 LiteIDE 没有 ...
- [C++] const与重载
下面的两个函数构成重载吗? void M(int a){} //(1) void M(const int a){} //(2) 下面的呢? void M(int& a){} //(3) voi ...
- scala recursive value x$5 needs type
recursive value x$5 needs type的原因是使用了一个类型不确定的变量,例如 val (id, name) = (id, getName(id)) 其中id是个变量,其值还不确 ...