Fibers:如何使用Node.js Fibers运行代码

我有一个关于 Nodejs Fibers 的问题(这对我来说是绝对新的)...我有这个 Nodejs Fibers 的教程,http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads-in-node-js-what-for/,这里有一个例子说

我有一个关于 Nodejs Fibers 的问题(这对我来说是绝对新的)...我有这个 Nodejs Fibers 的教程,http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads-in-node-js-what-for/,这里有一个例子说

    var fiber = Fiber.current;
    db.connect(function(err, conn) {
    if (err) return fiber.throwInto(err);
       fiber.run(conn);
    });
   // Next line will yield until fiber.throwInto 
   // or fiber.run are called
   var c = Fiber.yield();
   // If fiber.throwInto was called we don't reach this point 
   // because the previous line throws.
   // So we only get here if fiber.run was called and then 
   // c receives the conn value.
   doSomething(c);
   // Problem solved! 

现在基于这个例子,我创建了我自己的代码版本,

  var Fiber = require('fibers');
  function sample(callback){
     callback("this callback");
  }
  var fiber = Fiber.current;
  sample(function(string){
     fiber.run(string);
  });
  var string = Fiber.yield();
  console.log(string);

但这给了我一个错误,

/home/ubuntu/Tasks/ServerFilteringV1/test.js:28
    fiber.run(string);
      ^
TypeError: Cannot call method 'run' of undefined

我还有另一种情况,它将在 1000 毫秒后运行一个函数,其中包含回调(我已经这样做是为了在回调之前测试长时间执行的函数),

var Fiber = require('fibers');
function forEach(callback){
   setTimeout(function(){
       callback("this callback");
   },1000);
}
var fiber = Fiber.current;
forEach(function(string){
   fiber.run(string);
});
var string = Fiber.yield();
console.log(string);

这 code 在这里给我另一个错误,

/home/ubuntu/Tasks/ServerFilteringV1/test.js:30
var string = Fiber.yield();
                    ^
Error: yield() called with no fiber running

那么,yield () 应该在 run () 函数执行后等待吗?任何关于我的 nodejs 代码中发生的事情的想并提前感谢...

21

示例1

纤程是一种轻量级的执行线程。像真正的线程和进程一样,纤程必须被赋予一个代码块,以便在运行时执行。从bjouhier获取的代码无常工作。它打算在光纤中运行,如下所示:

var f = Fiber(function() {
    var fiber = Fiber.current;
    sample(function(str) {
        fiber.run(string);
    });
    var str = Fiber.yield();
    console.log(str);
});
f.run();

在光纤上调用run会运行光纤代码,该代码是作为Fiber的回调给出的。但是,上面的代码也会给出一个错误(说明光纤已经在运行)。在分析执行顺序时,人们可能会很容易地看到原因。

变量f设置为光纤。

运行光纤:

设置变量fiber指向当前运行的光纤。

Callfunctionsample.

调用回调。

调用fiber.run,这将给出错误,因为当前光纤已经在运行。

这个代码的结构是正确的,但它假设sample是一些异步函数,不会立即调用回调。

function sample(callback) {
    setTimeout(function() {
        callback("this callback");
    }, 500);
}

现在,上面的代码不会发出错误,因为sample立即返回。

设置fiber指向当前运行的光纤。

调用sample,它在不调用回调(还)的情况下返回。

调用'Fiber.yield (),它将暂停当前光纤。

500 毫秒后,调用回调。

调用fiber.run()通过“此回调”,该回调恢复光纤。

Fiber.yield返回,str 设置为“此回调”。

日志字符串到控制台。

观察到步骤 4 是在光纤的执行之外完成的。

示例2

而在第一个例子中,没有运行的光纤(因此fiber未定义),在第二个例子中,错误是出于同样的原因抛出的。

产量和运行的函数

放弃控制的意思是“yieldingcontrol”,在本例中是Fiber.yield()

为了继续执行 (直接在光纤产生的点之后),必须在光纤上调用run()

将值传入和传出光纤的机制是通过产量和运行的相互作用:

yield(在光纤内部)返回给run(在光纤外部)的参数。

run(光纤外部)返回给yield(光纤内部)的参数。

例如,请查看the github repository of node-fibers上的增量生成器。此外,请观察我们的示例 1,给sample的回调基本上在光纤外部运行,因为它在下一个滴答上运行(即setTimeout的异步性质)。

0

正如 Andrew 所解释的那样,正如我的博客文章中所暗示的那样(参见的句子),您必须创建一个Fiber并使用run()运行它才能调用Fiber.yield

纤维的好处并不明显,当你有一个单一的 async 调用来运行,但考虑到你有一个函数可以调用f22调用一个带有回调的低级 async 函数,如果你不使用纤维,你必须把2

因此,当您的高级函数和它们调用的低级异步函数之间有多层代码或复杂的控制流时,光纤真的会发光。

此外,编写光纤的 Marcel 建议您不要直接在代码中使用Fiber.yield(),而是使用他的futures库。使用Fiber.yield了解光纤的组成很有趣,但我建议您将futures库用于实际项目。它还将帮助您并行化代码。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(899)
Html响应式网页设计:为什么在响应式网页设计中使用 HTML5
上一篇
Win 10 s:arp-s返回添加ARP条目失败:访问被拒绝Win10
下一篇

相关推荐

  • Js加密:Node.js使用-nosalt选项加密加密

    关于Js加密的问题,在nosalty中经常遇到,从这个帖子:What's wrong with nodejs crypto decipher?我想出了要使我的代码工作,我需要使用 openSSL-nosalt 选项 beacuase 加密我的数据 node.js 加密库的工作方式。由于我使用 Node.js 加密库进行加密,我需要知道如何使用-nosalt 选项加密数据。另外我正在使用 openSSLaes256算法。…

    2022-12-08 09:50:54
    0 30 59
  • webstorm配置nodejs环境:如何在WebStorm中配置Node.js环境

    示例示例需要安装node.js,在官网上下载对应的安装包,并进行安装,安装完成后,可以在命令行中输入node -v查看是否安装成功。在中,打开File -> -> & -> Node.js and NPM,在Node 中选择刚刚安装的node.js的安装路径,点击OK即可完成node.js的配置。…

    2023-12-27 04:51:02
    0 65 59
  • nodejs 安装 linux:如何使用Node.js在Linux上安装应用程序

    wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz…

    2023-11-11 10:50:58
    0 51 53
  • nodejs搭建web服务器:如何使用Node.js搭建Web服务器?

    示例示例Node.js可以用来搭建web服务器,下面是一个简单的示例代码:// 引入http模块…

    2023-06-05 10:35:58
    0 60 69
  • 在node.js中按名称获取 mongodb集合

    我目前正在学习 node.js,这是我的第一个项目。这是(据说)一个简单的待办事项列表应用程序,其中有多个列表我可以加载 / 编辑 / 保存 / 删除。…

    2022-11-11 15:20:41
    0 13 36
  • nodejs 微信小程序轻松构建跨平台应用

    Node.js 微信小程序是一种基于 Node.js 开发的微信小程序,它可以让开发者使用 JavaScript 语言来编写微信小程序。…

    2023-06-24 09:17:26
    0 81 25
  • Snap股价:带有Snap的Nodejs

    关于Snap股价的问题,在ubuntu snap vs apt中经常遇到,我已经从 snapcraft 商店安装了 nodejs-v 13。而且,现在我想删除该节点版本并切换到较低版本。在这里,我想知道如何删除它,因为“sudo apt-get purge nodejs”或“sudo apt-get remove nodejs”似乎不起作用。…

    2022-12-29 05:54:59
    0 49 20
  • 小程序应用平台:nodejs express应用程序在小橙色

    关于小程序应用平台的问题,在a small orange email settings中经常遇到,我是新来的“小橙”,我试图运行在小橙色的快递应用程序this link…

    2022-11-29 12:48:09
    0 43 11

发表评论

登录 后才能评论

评论列表(84条)