位置: 编程技术 - 正文

nodejs中的fiber(纤程)库详解(nodejs中的session)

编辑:rootadmin

推荐整理分享nodejs中的fiber(纤程)库详解(nodejs中的session),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs中的事件循环的执行顺序,nodejs中的socket,nodejs中的this,nodejs中的模块加载机制都有哪些,nodejs中的this,nodejs中的全局变量有哪些,nodejs中的事件循环的执行顺序,nodejs中的事件循环的执行顺序,内容如对您有帮助,希望把文章链接给更多的朋友!

fiber/纤程

在操作系统中,除了进程和线程外,还有一种较少应用的纤程(fiber,也叫协程)。纤程常常拿来跟线程做对比,对于操作系统而言,它们都是较轻量级的运行态。通常认为纤程比线程更为轻量,开销更小。不同之处在于,纤程是由线程或纤程创建的,纤程调度完全由用户代码控制,对系统内核而言,是一种非抢占性的调度方式,纤程实现了合作式的多任务;而线程和进程则受内核调度,依照优先级,实现了抢占式的多任务。另外,系统内核是不知道纤程的具体运行状态,纤程的使用其实是比较与操作系统无关。

在node中,单线程是仅针对javascript而言的,其底层其实充斥着多线程。而如果需要在javascript中实现多线程,一种常见的做法是编写C++ addon,绕过javascript的单线程机制。不过这种方法提升了开发调试的难度和成本。像其他很多脚本语言,我们也可以把纤程的概念引入到node中。

node-fibers

node-fibers这个库就为node提供了纤程的功能。多线程方面没有测试出理想的结果,不过在异步转同步作用显著,也许在减少node调用堆栈、无限递归方面也会有价值可挖。本文档主要介绍 node-fibers库的使用方法和异步转同步等内容。

安装

node-fibers是采用C语言编写,直接下载源码需要编译,通常直接npm安装即可:

fibers库的使用

API

1.Fiber(fn)/ new Fiber(fn):

创建一个纤程,可以当成构造函数使用,也可以当成普通函数调用。如下例:

当 run()调用的时候,纤程启动,并为 fn分配新的堆栈, fn会在这个新的堆栈上运行,直到 fn有返回值或调用 yield()。 fn返回后或调用 yield()后,堆栈重置,当再次调用 run()时,纤程会再次启动, fn运行于首次分配的堆栈中。

2.Fiber.current:

获得当前纤程,并可对其进行操作。如果指定一个变量与其相关联,请务必确保此纤程能够释放,否则V8的垃圾回收机制会一直忽略这部分的内存,造成内存泄漏。

3.Fiber.yield(param):

前面的说明中已经提及过这个函数。 yield()方法用于中断纤程,一定程度上类似 return。一旦执行 yield(),则此 Fiber中后续代码将没有机会执行,例如:

执行后只会输出“Fiber Start”,后一个输出命令没有执行。如果向 yield()传入参数,那么此参数作为 run()的返回值。

4.Fiber.prototype.run(param):

这个方法已经很熟悉了,之前隐约有提及调用 run()的两种时态,一是Fiber未启动时,一时Fiber被yield时。在这两种时态下, run()的行为并不太一样。当Fiber未启动时, run()接受一个参数,并把它传递给 fn,作为其参数。当Fiber处理yielding状态时, run()接受一个参数,并把它作为 yield()的返回值,fn并不会从头运行,而是从中断处继续运行。关于 fn、 yield、 run三者的参数、返回值等关系,可以通过下面的小例子来说明:

输出如下:

从上面例子中,可以很明显看出 yield的使用方法与现在的javascript的语法相当不同。在别的语言中(C#、Python等)已经实现了 yield关键字,作为迭代器的中断。不妨在node上也实现一个迭代器,具体体会一下 yield的使用。还是以开头的斐波那契数列为例:

输出为:

有两个问题需要留意,第一, yield说是方法,更多地像关键字,与 run不同, yield不需要依托Fiber实例,而 run则需要。如果在Fiber内部调用 run,则一定要使用: Fiber.current.run();第二, yield本身为javascript的保留关键字,不确定是否会、何时会启用,所以代码在将来可能会面临变更。

5.Fiber.prototype.reset():

我们已经知道Fiber可能存在不同的时态,同时会影响 run的行为。而 reset方法则不管Fiber处理什么状态,都恢复到初始状态。随后再执行 run,就会重新运行 fn。

6.Fiber.prototype.throwInto(Exception):

本质上 throwInto会抛出传给它的异常,并将异常信息作为 run的返回值。如果在Fiber内不对它抛出的异常作处理,异常会继续冒泡。不管异常是否处理,它会强制 yield,中断Fiber。

nodejs中的fiber(纤程)库详解(nodejs中的session)

future库的使用

在node中直接使用Fiber并不一直是合理的,因为Fiber的API实在简单,实际使用中难免会产生重复冗长的代码,不利于维护。推荐在node与Fiber之间增加一层抽象,让Fiber能够更好地工作。 future库就提供了这样一种抽象。 future库或者任何一层抽象也许都不是完美的,没有谁对谁错,只有适用不适用。比如, future库向我们提供了简单的API能够完成异步转同步的工作,然而它对封装 generator (类似上面的斐波那契数列生成器)则无能为力。

future库不需要单独下载安装,已经包含在 fibers库中,使用时只需要 var future=require('fibers/future') 即可。

API

1.Function.prototype.future():

给 Function类型添加了 future方法,将function转化成一个“funture-function”。

实际上 power方法是在Fibel内执行的。不过现有版本的 future有bug,官方没有具体的说明,如果需要使用此功能,请删除掉 future.js的第行和第行。

2.new Future()

Future对象的构造函数,下文详细介绍。

3.Future.wrap(fn, idx)

wrap方法封装了异步转同步的操作,是 future库中对我们最有价值的方法。 fn表示需要转换的函数, idx表示 fn接受的参数数目,认为其 callback方法为最后一个参数(这边API的制定颇有争议,有人倾向传递 callback应该处于的位置,好在 wrap方法比较简单,可以比较容易修改代码)。看一个例子就能了解 wrap的用法:

从这个例子中可以看出Fiber异步转同步确实非常有效,除了语法上多了一步 .wait()外,其他已经 fs提供的 fs.readFileSync方法别无二致了。

4.Future.wait(futures):

这个方法前面已经多次看到了。顾名思义,它的作用就是等待结果。如果要等待一个future的实例的结果,直接调用 futureInstance.wait()即可;如果需要等待一系列future实例的结果,则调用 Future.wait(futuresArray)。需要注意的是,在第二种用法中,一个future实例在运行时出现错误, wait方法不会抛出错误,不过我们可以使用 get()方法直接获取运行结果。

5.Future.prototype.get():

get()的用法与 wait()的第一种方式很像,所不同的是, get()立刻返回结果。如果数据没有准备好, get()会抛出错误。

6.Future.prototype.resolve(param1,param2):

上面的的 wrap方法总给人以一种 future其实在吞噬异步方法的回调函数,并直接返回异步结果。事实上 future也通过 resolve方法提供设置回调函数的解决方案。 resolve最多接受两个参数,如果只传入一个参数, future认为传了一个node风格的回调函数,例如如下示例:

如果传入两个参数,则表示对错误和数据分别做处理,示例如下:

另外 future并不区分 resolve的调用时机,如果数据没有准备好,则将回调函数压入队列,由 resolver()方法统一调度,否则直接取数据立即执行回调函数。

7.Future.prototype.isResolved():

返回布尔值,表示操作是否已经执行。

8.Future.prototype.proxy(futureInstance):

proxy方法提供一种 future实例的代理,本质上是对 resolve方法的包装,其实是将一个instance的回调方法作为另一个instance的回调执行者。例如:

虽然执行的是 proxy,但是最终 target的回调函数执行了,并且是以 proxy的执行结果驱动 target的回调函数。这种代理手段也许在我们的实际应用中有很大作用,我暂时还没有深入地思考过。

9.Future.prototype.return(value):

.Future.prototype.throw(error):

.Future.prototype.resolver():

.Future.prototype.detach():

以上四个API呢我感觉相对于别的API,实际使用的场景或作用比较一般。 return和 throw都受 resolver方法调度,这三个方法都很重要,在正常的future使用流程中都会默默工作着,只是我没有想出具体单独使用它们的场景,所以没有办法具体介绍。 detach方法只能算 resolve方法的简化版,亦没有介绍的必要。

nodejs开发微博实例 之前一直执着于前端开发,最近几天,开始学起了nodejs。作为一名前端开发者,见到这样一门用javascript写的后台自然是很激动的。但是,后台毕竟不同

nodejs中实现阻塞实例 node.js中与生俱来的单线程编程、回调函数异步式风格让我们有时喜有时忧。先说单线程,很多人会费解于node.js的单线程如何能做到高并发?这个问题不

nodejs中使用多线程编程的方法实例 在以前的博文别说不可能,nodejs中实现sleep中,我向大家介绍了nodejsaddon的用法。今天的主题还是addon,继续挖掘c/c++的能力,弥补nodejs的弱点。我曾多次

标签: nodejs中的session

本文链接地址:https://www.jiuchutong.com/biancheng/378018.html 转载请保留说明!

上一篇:nodejs中实现sleep功能实例(nodejs sleep方法)

下一篇:nodejs开发微博实例(html5仿微博代码)

  • 向税务局申请发票增量增额怎么写
  • 不征税收入计入应纳税所得额吗
  • 发票在系统里作用大吗
  • 同一控制下的长期股权投资入账成本
  • 记账软件收费吗
  • etc充值怎么操作
  • 存出资本保证金是金融资产吗
  • 企业接受外部劳务派遣用工支出税前扣除问题
  • 环境评估费应计入什么科目
  • 罚款收入需要开票吗
  • 申请补贴费用怎么写
  • 投资损益表该如何填列
  • 付给供应商远期延期支票怎么做账?
  • 汇算清缴补交所得税会计分录小企业会计政策
  • 申办企业所得税抵缴带哪些资料?
  • 公司车辆过户给公司
  • 出现一窗式比对失败,该纳税人没有防伪税控比对信息!
  • 个人汽车租给公司租金需多少钱?
  • 本月收到外汇怎么做账
  • 代销商品
  • 财产行为税税种
  • mac苹果电脑系统
  • 应付福利费科目
  • 销售原材料计入哪里
  • 企业注销时当月要缴税吗
  • 认缴出资额和实缴出资额的时间
  • 收到发票已入账什么意思
  • 混合债清偿顺序
  • laravel视频教程
  • 在树洞中休息的英语
  • web自动化测试方法
  • photo-sphere-viewer中文文档
  • yolov5训练命令
  • php实现会话的步骤
  • 收押金退押金会计分录
  • 微服务组件面试题
  • 往来款项的含义
  • 企业收到财政补贴如何开票
  • 简易计税是否可以享受即征即退
  • 辞职单位补偿标准
  • 员工意外伤害保险可以抵扣进项税吗
  • 汇兑损益的现金流量
  • 个税系统经营所得人员怎样添加
  • 现金流量表的编制公式 计算公式
  • 固定资产超过多少入账
  • 过次页和承前页怎么算
  • 临时售楼部招牌效果图
  • 买入返售金融资产属于金融资产吗
  • 存货报废如何做账
  • 开办职工食堂
  • 医疗器械销售能一年挣一百万么
  • 什么时候用税前项目举例说明工程项目
  • 本月增值税申报截止日
  • 预支款怎么做现金账
  • macossierra安装发生错误
  • windows xp计算器
  • ubuntu系统中怎么安装mathematica13.1.0
  • win7系统无法启动怎么解决
  • win10web服务器在哪打开
  • centos安装问题
  • cocos2dx用checkbox实现单选框和button实现table按钮
  • Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
  • easyui multiple
  • 值得收藏的十大收录机
  • linux find -cmin
  • U3DPlayer UnityWebPlayer动态改变src
  • 编写shell脚本,实现备份文件:每天18:00归档
  • python写抢购教程
  • javascript Window及document对象详细整理
  • 从最近两会看苹果和谷歌的最大梦魇
  • js设置按钮禁用和开启
  • jquery插件是干什么的
  • 所得税季度报表收入成本怎么填
  • 核准类结算账户包括
  • 企业自建房如何缴税
  • 娱乐会所一般有什么
  • 监察室主任岗位职责
  • 地税逾期了怎么申报
  • 个体户刻公章需要备案吗
  • 个人所得税app密码给别人有风险吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设