`
inshua
  • 浏览: 8155 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

將輸入視為消息還是閉包

阅读更多
法一

如果當作閉包理解,接收函數效果大致如下:

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 平臺,使用法二是一個不錯的選擇。
分享到:
评论
1 楼 sp42 2012-11-12  
引用
Object is just poor man's closure.

相关推荐

    Java闭包 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的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。

    C语言实现三种闭包算法(传递,自反,对称闭包)

    C语言实现三种闭包算法,能够实现传递,自反,对称闭包

    传递闭包Warshall算法

    实验名称:Warshall算法计算关系的传递闭包 ...cout所输入矩阵M的传递闭包矩阵为:"; for(i=1;i;i++) { for(j=1;j;j++) cout[i][j]; cout; } char g; cin>>g; return 0; } 运行结果:

    闭包问题html

    闭包文件

    Swift之闭包ClosureDemo

    Swift之闭包ClosureDemo

    Javascript 闭包完整解释

    Javascript 闭包完整解释

    js闭包详细讲解

    js闭包的详细讲解

    传递闭包的C语言编程实现

    离散数学中传递闭包是用Warshall算法求的,此程序正式这种算法的C语言实现

    C++对称闭包对称闭包

    用矩阵求对称闭包。简洁,轻松学习,相互交流。

    闭包概念原理

    闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的

    Python闭包实例closure.py

    Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用

    js闭包个人理解

    js闭包的个人理解

    JS匿名函数、闭包

    但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止;使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数...

    最符合菜鸟的闭包

    适合最低级菜鸟理解的重点难点知识---闭包.zip

Global site tag (gtag.js) - Google Analytics