Tag: 事件循环

如何debugging一个NodeJS阻塞的事件循环?

我们有一个运行在生产环境中的NodeJS / Express服务器,有时候所有的请求都被阻塞了。 networking请求正在接收,但没有处理(他们最终全部超时)。 几分钟后,它会再次接受请求,但几乎立即像以前一样开始阻塞。 我们一直试图在本地重现此问题,但无法重现并确定原因。 我的猜测是,事件循环被阻塞的时间太长,无法完成,或者根本不完成。 是否有任何方法来debugging现场制作系统,并找出是什么原因导致该块? 我search了,但只能find本地发展的解决scheme。 我最好的解决scheme是回顾日志,查看最后一个没有阻塞的请求(在开始阻塞之前),并debugging它? 使用Node 6.2.2,Express 4.13.4,并在Heroku上运行。

Node.js或expression自己阻止事件循环?

我有非常简单的Node.js 8.5.0 Express 4.15.5服务器与集群模块,服务静态文件。 问题在于事件循环似乎在很长一段时间内被阻塞。 我正在使用阻塞的模块,并跟踪自上次检查以来处理了多less个请求,使用超时间隔70毫秒。 很多时候,计数器只是零:有时没有请求,事件循环有时被阻塞。 日志: Execution blocked for 1056 ms [2017-09-27 16:18:06.322], 1 requests, total requestcount 115, pid 31071 Execution blocked for 358 ms [2017-09-27 16:18:12.570], 0 requests, total requestcount 123, pid 31071 Execution blocked for 1578 ms [2017-09-27 16:18:15.551], 10 requests, total requestcount 147, pid 31071 Execution blocked for 872 ms […]

集成testinggeteventstore使用rxjs有竞争条件

对不起,这个有点乱。 我的项目在nodejs中。 我在摩卡testing。 在这里我打开一个连接到geteventstore并订阅一个stream。 这基本上开始发射事件。 我把这个事件订阅包装在一个rxjs observable中,然后把它写到控制台。 有一半的时间我有一半的时间,我没有得到一个事件stream。 我感觉到eventloop开始聆听,没有听到任何东西,并在geteventstore可以开始使用事件爆炸之前closures。 我有点不知所措 我可以告诉geteventstore发送数据cuz一半的时间,我得到它。 我的理解是,只要有人订阅了一个事件,例如有一个事件侦听器,循环就会保持打开状态。 所以也许问题是与rxjs? 我不知道,任何帮助将不胜感激。 – – 编辑 我不知道这是否会有所帮助,但testing看起来像这样。 context('when calling subscription', ()=> { it('should stay open', function () { mut = bootstrap.getInstanceOf('gesConnection'); var rx = bootstrap.getInstanceOf('rx'); var subscription = mut.subscribeToAllFrom(); rx.Observable.fromEvent(subscription, 'event').forEach(x=> console.log(x)); subscription.on('event', function (payload) { console.log('event received by dispatcher'); console.log('event processed by dispatcher'); […]

如何理解Node.js事件循环

其实我现在正在学习node.js。 尽pipe我已经学习了许多关于node.js的东西,比如安装模块并使用它们,但我还没有理解node.js的实际核心function(事件循环和非阻塞I / O)。 我已经读了许多关于apache的multithreading和处理和JavaScript事件循环,但没有一个给我正确的来源,学习与良好的例子。 任何帮助,将不胜感激。 谢谢。

seleniumwebdriver挂在非常简单的JavaScript代码promise.then

最近我和nodejs&selenium-webdriver经历了一个非常奇怪的错误。 它看起来与nodejs事件循环/ promise / selenium-webdriver相关。 简而言之: webdriver.get调用在使用时会挂起一些promise.then 。 首先,让我们看看一段JavaScript代码,效果很好: const WebDriver = require('selenium-webdriver') var driver = new WebDriver.Builder() .setAlertBehavior('ignore') .forBrowser('chrome') .build() function ok() { console.log('ok: driver.get will open a browser window\n' + '\n' + ok + '\n') driver.get('about:blank') } ok() 这段代码将打开一个浏览器窗口,按预期工作。 但是下面的所有代码都会显示奇怪的行为。 Bug – driver.get会挂起 添加一个虚拟的.then(() => 'test') function bug() { console.log('bug: `driver.get` will hang\n' […]

NodeJs事件循环中的setTimeout()如何工作?

我已经阅读了很多相关的文档,但是我仍然不明白它是如何工作的。 但我仍然不明白在Nodejs事件循环的阶段setTimeout()如何? const fs = require('fs') const now = Date.now(); setTimeout(() => console.log('timer'), 10); fs.readFile(__filename, () => console.log('readfile')); setImmediate(() => console.log('immediate')); while(Date.now() – now < 1000) { } const now = Date.now(); setImmediate(() => console.log('immediate')); setTimeout(() => console.log('timer'), 10); while(Date.now() – now < 1000) { } 我认为第一块代码应该logging: readfile immediate 而第二块代码日志。 timer immediate 我认为没关系。 问题:我不明白为什么第一块代码是日志 immediate […]

为什么在主模块中使用setTimeout(0)和setImmediate()的行为未定义?

从nodejs事件循环文档中取下面的代码: // timeout_vs_immediate.js setTimeout(() => { console.log('timeout'); }, 0); setImmediate(() => { console.log('immediate'); }); 根据文件: 例如,如果我们运行以下不在I / O周期内的脚本(即主模块),则两个定时器的执行顺序是非确定性的,因为它受过程执行的约束。 为什么上述说法是正确的? 是否因为nodejs运行时实际上使用了多个线程来挑选必须执行的callback。 我的直觉是这样说的:有两个线程为setTimeout和setImmediate执行callback,所以当两者都可用时,这会导致竞争条件,因此输出将是非确定性的。 这是对的吗 ? 或者还有什么其他的原因是不确定的?

是否按顺序调用process.nextTick的callback函数?

如果多次调用process.nextTick() ,是否按顺序执行callback? 换句话说,Node事件循环是否给所有对process.nextTick调用赋予相同的优先级,并按FIFO的顺序执行它们? 例如: process.nextTick(() => console.log('1')) process.nextTick(() => console.log('2')) process.nextTick(() => process.nextTick(() => console.log('3')) ) process.nextTick(() => process.nextTick(() => console.log('4')) ) 这会不会打印1 2 3 4 ?

Node.js Uncaught TypeError:callback不是process.nextTick中的函数

我收到以下错误。 这显然来自传递给process.nextTick的callback。 鉴于堆栈跟踪几乎不可用,我该如何debugging? 幕后发生了什么,如何在一个更大的项目中解决这个问题? TypeError: callback is not a function at nextTickCallbackWith0Args (node.js:420:9) at process._tickDomainCallback (node.js:390:13) NB老版本的Node有不同的process.nextTick实现,并且吐出下面的堆栈跟踪。 Uncaught TypeError: undefined is not a function at process._tickCallback (node.js:415:13)

等待一个asynchronous函数在Node.js中返回

假设,我在Node.js中有一个asynchronous函数,基本上是这样的: var addAsync = function (first, second, callback) { setTimeout(function () { callback(null, first + second); }, 1 * 1000); }; 现在我当然可以用asynchronous风格调用这个函数了: addAsync(23, 42, function (err, result) { console.log(result); // => 65 }); 我想知道的是,是否可以使它以某种方式同步调用此function。 为此,我想有一个包装函数sync ,基本上做以下事情: var sync = function (fn, params) { var res, finished = false; fn.call(null, params[0], params[1], function (err, result) { […]