js并发之csp模型

回调方式

最传统以及最容易想到的一种方式。

在大量项目中,都有使用

举个栗子:

process1(data,function(data2){
    process2(data2,function(data3){
        process3(data3,function(data4){
            console.log(data4)
        }
    })
}

promise 方式

对比下promise,promise 方式,实现了调用链扁平化

不过其本质还是回调

process1(data).then(data2=>{
    return process2(data2)
}).then(data3=>{
    return process3(data3)
}).then(data4=>{
    console.log(data4)
})

async 和 await

再对比下使用async 和 await

async 和 await 在

async function main() {
	var data2 =await process1(data);
	var data3 =await process2(data2);
	var data4 =await process3(data3);
	console.log(data4);
}
main();

csp

关于什么是csp ,参考 csp

简单来说,就是使用chan 来处理并发问题。

比如golang、erlang等

查看一个例子:

这个例子有一个自然数生成器。

然后另外一边则取数据然后打印

async  function generate(ch) {
    for(var i=0;true;i++){
      await ch.put(i)
    }
}

async function main(){
	var ch=new jschan.Chan();
	generate(ch);
	while(true){
		console.log(await ch.get());
	}
}

main();

再举个例子:

当要实现,向后端有N个请求,异步发送并等待

async function fetch(url,ch){
	var data=await Fetch(url);
	await ch.put({
		url:url,
		data:data
	})
}

async function main(){
	var ch=new jschan.Chan();
	fetch(url1,ch)
	fetch(url2,ch)
	fetch(url3,ch)

	await ch.get()
	await ch.get()
	await ch.get()
}

main()

场景如果更复杂一些,优势就比较明显了。

基于以上描述,可以做很多事情。比如 WaitGroup Select 或其他东西

然而,看到这里,你估计发现了。上面的jschan 是什么鬼?

其实,js语言并未支持channel。这里是我的一个简单实现。

具体源码在: https://github.com/humboldt-xie/jschan

humboldt Written by:

humboldt 的趣味程序园