在事件处理程序中读取和写入全局variables:什么时候是并发性问题?
我是Node.JS的新手,并开始阅读关于Node.js事件处理和并发性的几个主题。
下面的代码触发1000次事件,这是通过增加一个全局variables来处理的。 代码的第一位成功地计数到1000,但第二位甚至没有增加到2.是否有我没有得到的primefaces性?
我仍然想知道为什么下面的代码提供了连贯的输出(它没有任何并发地成功计数到1000:
// Import events module var events = require('events'); // Event emitter var eventEmitter = new events.EventEmitter(); var max = 1000; var count = 0; eventEmitter.on('event', () => { let time = Math.trunc(Math.random() * 1000) +1; setTimeout(() => { var c = count; c++; count = c; console.log(c); }, time); }); // Fire for (let i = 0; i < max; i++) { eventEmitter.emit('event'); } console.log('Program Ended.');
有没有primefaces性,我没有得到?
但是,当我移动var创build和分配时,输出是完全不同的(最终结果是1)。
// Import events module var events = require('events'); // Event emitter var eventEmitter = new events.EventEmitter(); var max = 1000; var count = 0; eventEmitter.on('event', () => { let time = Math.trunc(Math.random() * 1000) +1; var c = count; setTimeout(() => { c++; count = c; console.log(c); }, time); }); // Fire for (let i = 0; i < max; i++) { eventEmitter.emit('event'); } console.log('Program Ended.');
有什么build议? 任何阅读?
祝你今天愉快 !
当代码开始的时候,你甚至可以一口气发出所有的事件。 所以你on 'event'
在启动程序后立即触发。 在每个事件处理程序完成后调用所有超时callback。 在您的event
callback(不是在settimeout
callback)中打印一个打印,并看到输出。
在第二个代码片段中,所有settimeout
callback都捕获count = 0
因为
var c = count;
在settimeout
callback之外,因此callback将其递增为1。
但在第一个代码片段计数是在callback内读取
var c = count;
所以每个callback都有更新的值。
从Bergi提供的外部资源:
所有Javascript事件处理程序脚本都是从一个主事件队列中处理的。 这意味着事件处理程序一次运行一个事件处理程序,一个事件处理程序一直运行,直到下一个准备就绪的事件开始运行。 因此,Javascript中没有竞争条件。 在JavaScript中执行任何单独的线程将在下一个开始之前运行完成。
从这个 。
和:
一个事件将在下一个事件触发前运行完成。 因此,如果在第一次点击仍在处理的同时发生第二次点击,则第二次点击将排队,直到处理完第一次的代码完成后才会运行。
从那
- 数据库插入/更新nodejs中的事件驱动事件
- 节点stream:如果一个可读的stream如果已经被排空(如果已经被排出),怎么会发出另一个可读的事件?
- 创build自定义EventEmitter时是否需要events.EventEmitter.call(this)?
- unit testing事件驱动的JavaScript
- Node.js EventEmitter:如何将类上下文绑定到事件侦听器,然后删除此侦听器
- 在.NET中使用C#可以在没有multithreading的情况下实现基于事件的asynchronous模式吗?
- 如何在nodejs和express中处理exception
- 用__proto__混合EventEmitter方法
- NodeJS – 单身+事件