Articles of 非阻塞

Node.js的 混淆了非阻塞的方法

好吧,似乎我很难开始思考..嗯..function的方式..或asynchronous的方式。 我对node.js比较陌生,但是我有很多年的C#,java,c ++经验。 图片我有简单的任务。 这个任务的想法是每一行都应该在上一行完成之后执行(阻塞操作)。 正常的做法,让我说,C#。 此外,(这是这篇文章的原因)让我们想象我们在我们的代码中有一条条件线。 这个伪代码如下: f = OpenFile("aaa.txt") If f.ReadLine(1) == "bbb" // read the first line line = f.ReadLine(2) // read the second line else line = ReadLine(3) // read the third line DataBase.Insert(line) // store the line in some database, lets say in mysql DeleteFile(f) 很简单。 现在,据我所知,node.js通过向几乎每个函数添加callback来使用非阻塞方法。 这样,这个简单的任务似乎成了我的噩梦。 如果我尝试重现上面的代码,它将如下所示: OpenFile(f, […]

你如何编写非阻塞模块?

从完全不同的背景来看,Node.js的工作方式对我来说仍然是一个非常陌生的概念。 我正在掌握在你的函数中使用callback的概念 ,但是当我试图支持模块化开发,并因此更好地扩展时,实际上很难实现这一点。 例如,我将如何返回一个函数的结果回到我的代码,或者说,而不是阻止访问? 我一直在阅读,但是我不能把这个事情做完,因为每个人都给我一个不同的答案。 以一个日志function,例如: exports.log = function (req, res, type) { // do stuff here } 提前致谢。

如何在node.js中使非IO操作同步与asynchronous?

我知道这个标题听起来像是十几个其他问题,可能是这样。 不过,我已经阅读了十几个问题,并search了一下,发现没有什么能够回答这些问题让我满意。 这可能是因为没有人正确回答,在这种情况下,你应该投票给我。 这可能是因为我很愚蠢,不了解其他答案(更可能),在这种情况下,你应该投我一票。 语境: 我知道Node.js中的IO操作被检测到,并且默认情况下是asynchronous运行的。 我的问题是关于仍然可能阻塞/运行很长时间的非IO操作。 假设我有一个for循环的函数blockingfunction函数,它可以增加或不增加(纯CPU周期,无IO),还有很多。 运行需要一分钟或更长时间。 说我希望这个function运行,只要有人向我的服务器发出特定的请求。 题: 很明显,如果我在代码的外层显式调用这个循环,所有东西都会阻塞,直到完成。 我读过的大部分build议都build议先启动所有其他处理程序/服务器等,然后通过process.nextTick或setTimeout(blockingfunction, 0)推迟函数的调用。 但是不会blockingfunction1然后只是阻止下一个周围的执行循环? 我可能是错的,但似乎这样做会启动所有我的其他东西,而不会阻止应用程序,但是当第一次有人提出请求导致blockingfunction被调用时,所有东西都会阻塞,只要它完成。 在setTimeout或process.nextTick调用中,是否将blockingfunction setTimeout与未来的操作共存,而不会阻塞它们? 如果没有,有没有办法使blockingfunctionfunction,而不重写它? 别人怎么处理这个问题呢? 我见过的很多答案都是“只要相信你的CPU密集的东西要快,它们就会”,但是这并不能令人满意。 缺less线程(在那里我可以保证,执行blockingfunction将与执行其他任何正在进行的交错),我应该重新编写CPU密集型/耗时循环使用process.nextTick来执行一个固定的,有保证的每个滴答快速的迭代次数?

阻止代码是否总是使用返回语句和非阻塞代码总是使用callback?

在初学者教程中,Node的非阻塞性质通常通过显示阻塞的例子(使用return语句)和非阻塞的Node例子(使用callback)来演示。 有关示例,请参阅此处 。 我应该把它作为一个“气味”,使用return在我的节点应用程序中创build阻止代码,并find一种方法来使用callback重做它?

在node.js和erlang vm中调用一个阻塞库

在node.js中,如果我的线程调用了一个阻塞库,它将不能接受任何更多的请求,直到它从库中取回响应。 这与Erlang虚拟机的情况是否一样 – 也就是说,如果其中一个进程调用阻塞库,其他进程是否可以继续接受请求?

如何通过mongoose非阻塞获取大数据?

我如何通过mongoose获得大量的收集,我得到的每一个文件返回,而不是整个集合的巨大数组? 目前我只使用以下查询: var query = templateData.find({}); query.exec(function (err, docs) { // docs as array }); 这样,查询function就像阻塞IO而不是非阻塞。 有没有办法让这个更无阻塞?

我对节点中的“非阻塞”的理解是否正确?

人们有时会把下面的callback模式称为asynchronous。 function beAsync(msg, cb){ cb(msg); } beAsync("a", function(msg){ console.log(msg); }); console.log("b"); 什么人有时会说beAsync允许其余的代码运行,然后callback发生在准备就绪时。 当我最初调用beAsync和真正的asynchronous函数(如fs.readFile ,必须有一些代码同步运行, 然后发生了一些事情 ,允许readFile代码允许其余的代码被允许运行。 我正确地说,代表callback的东西进入一个低于JavaScript的循环吗? 所以beAsync的修改将包括一个setTimeout。 function beAsync(msg, cb){ setTimeout( function(){ cb(msg) }, 1); } 所以setTimeout和readFile的内部可以讲一个JavaScript所在的层? 说到这个低层是在JavaScript中实现非阻塞代码的唯一方法?

Node.js,进程和线程的问题

进程是否至less有一个线程正在运行? 如果是这样,那么Node.js将默认有1个主线程和1个事件循环线程运行?

文件收集和聚合结果报告的操作与非阻塞IO

我想对任意大的文件进行一些任意的昂贵的工作。 我想实时报告进度,然后在所有文件处理完毕后显示结果。 如果没有与我的expression式匹配的文件,我想抛出一个错误。 想象一下,编写一个testing框架,加载所有testing文件,执行它们(不按特定顺序),实时报告进度,然后在所有testing完成后显示聚合结果。 用阻塞语言(比如Ruby)编写这个代码非常简单。 事实certificate,在节点中执行这个看似简单的任务时遇到了问题,同时也真正利用了基于事件的asynchronousIO。 我的第一个devise是连续执行每一步。 加载所有的文件,创build一个文件集合进行处理 处理集合中的每个文件 在处理完所有文件后报告结果 这种方法确实有效,但对我来说看起来并不完全正确,因为它导致我的程序中计算量更大的部分等待所有的文件IO完成。 Node是不是被devise来避免的那种等待? 我的第二个devise是处理每个文件,因为它是在磁盘上asynchronous发现的。 为了争辩,让我们设想一下这样的方法: eachFileMatching(path, expression, callback) { // recursively, asynchronously traverse the file system, // calling callback every time a file name matches expression. } 而这种方法的消费者看起来像这样: eachFileMatching('test/', /_test.js/, function(err, testFile) { // read and process the content of testFile }); 虽然这个devise感觉像是一个非常“节点”的IO工作方式,它有两个主要问题(至less在我大概是错误的实现): 我不知道什么时候所有的文件都被处理了,所以我不知道什么时候汇编和发布结果。 由于文件读取是非阻塞的,recursion的,我正在努力如何知道是否没有find文件。 我希望我只是在做一些错误的事情,并且有一些合理简单的策略,其他人用第二种方法工作。 […]

嵌套请求被阻塞

我对nodejs比较新。 我最近把过去几个月收集的所有集体知识汇集到一个项目中。 我相信我已经在nodejs中遇到了我的第一个“阻塞”问题。 我有一个页面加载两个request()调用,他们是asynchronous和相应嵌套。 最内层的使用来自最内层的数据来redirect用户。 request(parameters,function(error, response, data){ //the first request passes a token request(newParamters,function(error, response, data){ //the second request passes a url res.redirect(data.info.url); }); }); 错误的是,当我在许多浏览器选项卡中打开它时,它会在第一对夫妇之后结束,然后服务器说data.info.url是未定义的。 我的问题是: 我是否应该一次只提出一项要求? 我可以保存令牌从第一个request()和redirect用户到第二个request()这将有助于? 我一直非常良心的asynchronous,而不是阻塞,我感到震惊,这是发生。 任何反馈将是伟大的!