node.js异步转同步 fibers模块

javascript最大的一个特点就是单线程,但是可以同时挂起多个执行链,同时javascript能够很简单的实现回调函数,这些都十分满足异步编程的要求,这些特点最终也成为了node.js的十分重要的属性,这十分符合非阻塞编程的模型的要求,从而也使得node.js具备了十分优秀的处理并发的能力。。。即使不用c语言,不用涉及epoll等也可以实现很好的并发性能。(当然在内存和cpu等方面还是具有很大的劣势)只需要编写较少的代码,降低了入门的门槛,而且代码越少出bug的可能性也就越小。。。

这里需要说的是,各种异步,函数回调是node.js高性能的基础,但同时也限制了node.js的适用范围,而且也很容易掉到坑中去。。。。例如,在一个大循环中不断的挂起回调作用链,会很容易让node.js爆栈。。而且有的时候很多业务逻辑如果用回调来实现的话,也会给代码的实现带来很大的难度。。。。

这个时候就可以选用fibers模块了,首先来看它的一个典型使用吧:

function doIt(key, value) {
    var fiber = Fiber.current;
    client.set(key, value, function(err, reply){
    	fiber.run();
    });
    Fiber.yield();
}
function doIt2(key) {
    var fiber = Fiber.current;
    client.send_command("PEXPIRE", [key, 1000 * 60 * 60], function(err, reply){
        console.log(err);
        console.log(reply);
        fiber.run();
    });
    Fiber.yield();
}

var fn = Fiber(function(str) {
    //console.log('wait... ' + new Date);
	//console.log(i);
	var i = 0;
	for (i = 0; i < 1000000; i++) {
        var key = "afdsdfdsdsdsffdsfdsfdsdsfadsfdsfdsafdsadsfsfsfafasdfafdsfdsafdsfasafdsfffsdfaddsfdsaasaa" + i;
        var value = "ccfdsfadfsafdsfadfafsafdsfdsfdsfafdsfasdfsasfdsfafdsfafdsafsadfasdfafdsfdafsfac";
        doIt(key, value);
        doIt2(key);
    }
    

    
    console.log('ok... ' + new Date);
});
这里首先用Fiber函数来建立一个需要在同步作用域中执行的函数,接着在需要异步执行的地方,首先var fiber = Fiber.current;用于获取当前的执行域,然后挂起回调,接着是:Fiber.yield();,这句话的作用可以理解为阻塞当前的执行域,并释放cpu,这样就为刚刚挂起的回调提供了cpu了,当回调执行完后fiber.run();用于使yield返回。。。

这样也就实现了将一步转换为同步。。。


其实网上一直有关于node.js的各种评价,其中很多都批评node.js的异步模型限制了它在企业级应用中的使用。。。

其实我倒是觉得这些都无所谓,只要能够利用node.js的优势就好了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值