Articles of 事件

将Node.js作为客户端连接到Common Lisp服务器

我已经在node.js的alpha阶段有了一个小型的但CPU很重的应用程序,这是一个小游戏。 我遇到了性能问题,我需要加速至less20倍才能达到testing版。 而且由于并行执行会使我走得很远,所以我决定好的开始将是在进程和线程之间共享游戏映射,以便对其执行并行操作。 这在节点上是不可能做到的,所以我决定在CL(SBCL + Linux)中编写肉感的部分,并通过unix域套接字连接到它。 计划是: [players] <-> (node.js front server) <-> (SBCL performing game ticks) 重点是,我需要在node.js和SBCL之间传递类似于socket.io的快速消息。 这是什么没有工作(你可以跳过这一部分) 在Node端,我不能使用纯socket.io,因为它不支持Unix域套接字,但net模块,所以我可以至less做socket.write('raw data') – 现在好没有比什么都好。 在CL方面,我试图运行woo web服务器(它支持本地套接字),我可以从节点连接到它并传递原始数据,但是所有不必要的HTTP部分都涉及到,并且woo始终作为服务器运行。 它正在等待GET / HTTP/1.1 …. 我没有find一个方法来首先从woo发起一个消息。 另外,它是完全没有logging和未注释的,并且涉及很多对C库的FF调用,这些我都不太熟悉。 所以我又经历了几个没有编译的CL Web服务器,不支持unix套接字,被放弃或者没有logging,最终转移到了纯sb-bsd-sockets,最后转到了iolib,但是我仍然无法弄清楚。 iolib看起来很有前途,但我无法从节点连接到它。 我有这个: (with-open-socket (socket :address-family :local :type :datagram ;; :connect :passive :local-filename "/tmp/socket") (format t "Socket created") ;; (listen-on socket) ;; (bind-address […]

单个请求花费很长时间处理这些非阻塞的io服务器时会发生什么情况?

使用nodejs或eventlet或任何其他非阻塞服务器,当给定的请求花费很长时间会发生什么,然后阻塞所有其他请求? 例如,请求进来,需要200ms计算,这将阻止其他请求,因为例如nodejs使用单个线程。 意思是每秒钟15K的时间将大大减less计算响应给定请求所花费的实际时间的b / c。 但是这对我来说似乎是错误的,所以我在问真正发生的事情,因为我无法想象事情是如何运作的。

NodeJS – 单身+事件

我将如何inheritanceevents.EventEmitter方法实现单身devise模式的模块? var EventEmitter = require('events').EventEmitter; var Singleton = {}; util.inherits(Singleton, EventEmitter); Singleton.createClient = function(options) { this.url = options.url || null; if(this.url === null) { this.emit('error', 'Invalid url'); } else { this.emit('created', true); } } module.exports = Singleton; 这会导致错误: TypeError: Object #<Object> has no method 'emit'

如何将socket.io(在nodejs中)的事件处理程序绑定到我自己的作用域?

我在我的nodejs服务器中使用“socket.io”。 有没有办法在我的类/模块(在浏览器)范围内运行注册的事件function? … init: function() { this.socket = new io.Socket('localhost:3000'); //connect to localhost presently this.socket.on('connect', this.myConnect); }, myConnect: function() { // "this.socket" and "this.f" are unknown // this.socket.send({}); // this.f(); }, f: function() { // … } …

Node.js – 从模块发射事件的最佳方法

我一直在玩EventEmitter,但我很困惑我该如何从一个模块实现它。 我已经看到了几种不同的方式,他们似乎都工作。 这里有一些我见过的: 从这里 : var Twitter = function() {…}; Twitter.prototype = new events.EventEmitter; 但是在“掌握节点”中,他们这样做: function Dog(name) { this.name = name; EventEmitter.call(this); } Dog.prototype.__proto__ = EventEmitter.prototype; (为什么你需要打电话?) 然后在我自己的代码中,我尝试了另一种方式: function Class() {} Class.prototype = EventEmitter.prototype; 他们都是以自己的方式inheritanceEventEmitter,所以最简单的解决scheme不是最好的?

如何让我的NodeJS应用程序永远在循环中运行

我已经写了一个NodeJS应用程序调用一个API,并在特定的时间仅在工作日发布到端点。 我可以设置一个cron作业来在指定的时间运行应用程序,但我宁愿运行它与node index.js并不断运行,什么也不做,直到它是正确的一天和时间,然后回到“睡眠”直到第二天。 我如何做到这一点? 我试了一下while循环: while (true) { myApp.run(); } 显然那不太好。 什么是正确的方法来做到这一点? 我应该重写我的模块使用事件,以便我发出一个时间,并有一个对它作出反应的监听器? – 编辑:更具体地说,我希望它以类似的方式运行在其中的Web服务器的应用程序。 当你启动应用程序,它正在运行,并等待连接; 它在请求和连接结束时不会退出,它仍然在等待更多的请求和连接。 – 编辑2:我宁愿不使用cron的原因是因为运行的日子和时间可以在appparsing的config.json文件中configuration。 我宁愿避免与cron混淆,只需通过编辑config.json文件来更改计划。 – 编辑3:我想自己编码,而不是使用模块。 当我试图编写一个永远运行的应用程序时,我的大脑总是很痛苦,我想了解它是如何完成的,而不是使用一个模块。 – 编辑4:这是我最终使用: function doStuff() { // code to run }; function run() { setInterval(doStuff, 30000); }; run();

非阻塞(事件驱动的I / O)与阻塞I / O

最近我偶然发现了一个名为nodeJS的漂亮的JS库,它就像服务器端的JS一样。 语言的主要特点是使用I / O,它使I / O的固有容量完全无阻塞使用callback! 我的问题是,如果这种完全不阻塞的I / O机制过去存在(给定事件驱动的I / O已经存在很长时间了),为什么它们在C#和高级语言Java(尽pipeJava有支持非阻塞I / O的NIO实现)? 目前,简单的文件读/写操作导致完全的I / O阻塞,事件驱动的I / O不是这种情况。 我想更好地理解事件驱动的I / O,以及它与我们在Java中的不同之处。

libuv工作线程或工作队列运行状况检查?

在libuv中,最终可能会在工作线程中绑定太多的工作或错误的代码。 有一个简单的函数可以检查工作线程或线程队列的健康状况吗? 它不一定是100%确定性的,毕竟不可能确定工作线程挂在慢代码还是无限循环上。 所以下面的启发式都是好的: 尚未处理的排队项目数。 如果这太大,可能意味着工作线程繁忙或挂起。 libuv是否有任何线程处理机制,如果工作线程在n秒内不检查,它会被终止?

什么决定使用promises或setTimeout延迟函数的调用顺序?

推迟函数的执行,例如在自定义事件处理中,是JavaScript中的一种常见模式(参见这里的例子)。 它曾经是使用setTimeout(myFunc,0)是唯一的方法来做到这一点,但承诺现在有一个替代: Promise.resolve().then(myFunc) 。 我以为这些东西几乎可以做同样的事情,但在一个包含自定义事件的库上工作时,我想我会发现是否有差异,所以我把下面的块放到节点中: var logfn=function(v){return function(){console.log(v)}}; setTimeout(logfn(1),0); Promise.resolve().then(logfn(2)); logfn(3)(); 我期待在控制台3,1,2上看到,但是我看到了3,2,1。所以换句话说,Promise不等同于使用setTimeout,并且先出来块。 至less在Node中。 我在Chrome和Firefox中重复了testing,结果相同,但是在Edge中出现了3,1,2。我也希望非本地的promise库能够在后台使用setTimeout,所以会和Edge一样。 什么决定了这些呼叫的顺序被解决? 这些不同的环境使用什么模型来确定执行顺序? 以上任何一种情况是否代表标准或非标准行为? 附言我没有build议依靠任何这种保持一致,我只是好奇。 在下面给出的答案指出我正确的方向,正如在下面的评论中简要提到的,我在杰克·阿奇博尔德杰克·阿奇博尔德 ( 杰克·阿奇博尔德的一篇杰出的文章中find了完整的答案(与上面的代码几乎相同),我虽然我加在这里,而不是把它埋在评论里。

unit testing事件驱动的JavaScript

我在用node.js编写一个服务器端应用程序,并希望包含unit testing。 我正在努力的一件事是unit testingEventEmitter和setInterval/setTimout的好方法 我有什么selectunit testingasynchronous服务器端JavaScript? 我知道我可以将另一个侦听器附加到作为testingfunction的EventEmitter,但是我怎样才能让testing函数运行? 部分unit testing是为了确保unit testing的每个部分都运行。 我可以自己使用setTimeout,但这似乎是一个黑客的解决scheme。 如果这有帮助,那么我试图testing一些exampler代码。 … function init(param) { … // run update entities periodically setInterval(this._updateEntities.bind(this, param.containerFull), 1000 / param.fps); … } … EntityUpdater.prototype = { … "_updateEntities": function updateEntitiesfunc(fn) { this._tickEmitter.emit( "tick", new dataContainer.DataContainer(this.getEntityCount()) .on( "full", fn.bind(this) ) ); }, … } … (发射会触发一个事件) [编辑] 我开始阅读一些EvevntEmittertestinghttps://github.com/ry/node/tree/master/test/simple ,这有助于我看到如何去做这件事。