法一
如果當作閉包理解,接收函數效果大致如下:
function recv(msg){
actionQueue.push(function(state, msg){ return function(){
//TODO howto handle this message;
}}(this, msg))
}
這個做法可以取到串行的效果,且接收消息時立即提交處理過程到隊列,看起來較為乾淨。
但如果 this 為值類型數據,當遇到幷發時,前一處理過程和後一過程將在同一個狀態上加工,會發生覆寫。
法二
如將該處理器設計為反哺的方式:
function recv(msg){
actionQueue.push(function(state){
//TODO howto handle this message
return new_state;
})
}
如上,處理隊列存儲的處理器接受一個參數 state,msg 因閉包帶進了處理器。在外部,需要一個推進 actionQuue 的調用:
var s1 = actionQueue.pop()(s0);
s1 = actionQueue.pop()(s1);
s1 = actionQueue.pop()(s1);
// so on
法三
消息隊列的使用方式大致如下:
var msg = actionQueue.pop();
var state = getState();
var state2 = handle(msg, state);
saveState(sate2);
var msg = actionQueue.pop();
var state = getState();
var state2 = handle(msg, state);
saveState(sate2);
// so on
這種方式使用相同的 handle 函數,因此它需要在一個 handle 中編寫所有處理邏輯。在函數處理語言中,會採用匹配方式使代碼看起來漂亮一些,當然,也會分出幾個子過程。如果是 java,還可能分出好些個類來。
法四
erlang 採用的方式是在等待消息前,先將處理過程、狀態壓棧,在收到消息後,將處理過程、狀態取出,讓處理過程處理狀態和消息。採用上面的寫法,大致如下:
// at first
process.hang(pid, {handle : someHandle, state : state})
function recv(pid, msg){
var p = process.get(pid);
p.handle(p.state, msg);
}
// if handler want loop
functiion someHandle(state, msg){
// TODO handle and handle ...
process.hang(pid, {handle : nextHandle, state : newState}
}
結論
考慮到函數的閉包特性,法二和法四具備相當的效果。但值得注意的是,法二屬於通常性質上的延後處理,法四貌似收到即處理,但在接收和處理之間,同樣有個投遞的過程。對於不具備切換和管理進程的平臺,法二是一個不錯的選擇,另外,法二還不需要設計信箱機制。
消息隊列的做法本身完全可行,做進程遷移更顯輕鬆,但它容易導致比較分散的代碼,容易演變為狀態機。
綜上,在 Java 平臺,使用法二是一個不錯的選擇。
分享到:
相关推荐
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
实验目的:熟悉warshall算法,...实验内容:从键盘输入一个关系的关系矩阵,自动求出自反闭包、对称闭包和传递闭包。 计算传递闭包用Warshall算法。 #include<iostream> using namespace std; #define N 4 class jz
离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...
个人总结:将所有属性元素组成一个集合(域)记为R;求R的所有子集(要用到第二步中的全排列~~~),设其中一个为Ri;对每一个子集求其闭包,记为Ri+;然后求Ri+的所有子集记为(Ri+)j;最后做映射Rià(Ri+)j。
3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...
内存泄露,闭包 内存泄露,闭包 内存泄露,闭包
计算NFA中各个状态的闭包,从键盘上输入一个NFA的描述信息(输入格式自行定义),将 该NFA的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。
C语言实现三种闭包算法,能够实现传递,自反,对称闭包
实验名称:Warshall算法计算关系的传递闭包 ...cout所输入矩阵M的传递闭包矩阵为:"; for(i=1;i;i++) { for(j=1;j;j++) cout[i][j]; cout; } char g; cin>>g; return 0; } 运行结果:
闭包文件
Swift之闭包ClosureDemo
Javascript 闭包完整解释
js闭包的详细讲解
离散数学中传递闭包是用Warshall算法求的,此程序正式这种算法的C语言实现
用矩阵求对称闭包。简洁,轻松学习,相互交流。
闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的
Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用
js闭包的个人理解
但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止;使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数...
适合最低级菜鸟理解的重点难点知识---闭包.zip