libuv

Nodejs Addons uv_queue_work segmentation fault

大憨熊 提交于 2019-12-08 00:21:35
问题 I'm trying to create a very little nodejs addons example. My c++ code is this: void __sleep(uv_work_t* req) { usleep(1000 * 1000 * 5); // = 5seconds } void after(uv_work_t *handle, int status) { printf("After\n"); } Handle<Value> foo(const Arguments& args) { HandleScope scope; uv_loop_t *loop = uv_default_loop(); uv_work_t req; uv_queue_work(loop, &req, __sleep, after); return scope.Close(Undefined()); } void InitAll(Handle<Object> exports, Handle<Object> module) { NODE_SET_METHOD(exports,

Libraries to compile libuv on os x?

孤街醉人 提交于 2019-12-07 15:08:43
问题 I'm trying to learn some libuv and it seems there's a great book that goes through it. However, the book doesn't explain how to actually compile it. I ran make on the code that I pulled from github, and compiled with GYP as described on the github (https://github.com/joyent/libuv). However I'm not sure what kind of libraries I need to include to get the code to compile. I tried to compile this code: /* first.c */ #include <stdio.h> #include <uv.h> int main() { uv_loop_t *loop = uv_loop_new();

Nodejs Addons uv_queue_work segmentation fault

假如想象 提交于 2019-12-06 13:44:27
I'm trying to create a very little nodejs addons example. My c++ code is this: void __sleep(uv_work_t* req) { usleep(1000 * 1000 * 5); // = 5seconds } void after(uv_work_t *handle, int status) { printf("After\n"); } Handle<Value> foo(const Arguments& args) { HandleScope scope; uv_loop_t *loop = uv_default_loop(); uv_work_t req; uv_queue_work(loop, &req, __sleep, after); return scope.Close(Undefined()); } void InitAll(Handle<Object> exports, Handle<Object> module) { NODE_SET_METHOD(exports, "foo", foo); } NODE_MODULE("myModule", InitAll) In js, this: console.log(myModule); myModule.foo();

前端知识体系-NodeJS相关】NodeJS基础知识全面总结

让人想犯罪 __ 提交于 2019-12-06 03:34:59
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象。 process:该对象表示Node所处的当前进程,允许开发者与该进程互动。 console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。 1.2 全局函数 定时器函数:共有4个,分别是setTimeout(), clearTimeout(), setInterval(), clearInterval(); require:用于加载模块; Buffer():用于操作二进制数据。 1.3 全局变量 __filename:指向当前运行的脚本文件名。 __dirname:指向当前运行的脚本所在的目录。 2. Node的三大特点 2.1 单线程 Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。 2.2 非阻塞I/O 由于Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。 当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程

Libraries to compile libuv on os x?

匆匆过客 提交于 2019-12-06 01:12:36
I'm trying to learn some libuv and it seems there's a great book that goes through it. However, the book doesn't explain how to actually compile it. I ran make on the code that I pulled from github, and compiled with GYP as described on the github ( https://github.com/joyent/libuv ). However I'm not sure what kind of libraries I need to include to get the code to compile. I tried to compile this code: /* first.c */ #include <stdio.h> #include <uv.h> int main() { uv_loop_t *loop = uv_loop_new(); printf("Now quitting.\n"); uv_run(loop, UV_RUN_DEFAULT); return 0; } I compiled it with the

Does libuv provide any facilities to attach a buffer to a connection and re use it

ぐ巨炮叔叔 提交于 2019-12-05 16:41:57
I am evaluating libuv as a library for a C/c++ server that I am writing. The protocol is length prefixed so as soon as I can read a 32 bit integer from the stream I should be able to tell what size of buffer I should allocate. The documentation says that the uv_read_start function might be called multiple times. UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb); Since I am using a length prefixed protocol, once I know the right size of the buffer I would like to allocate it and re use it for subsequent reads till I have received all my bytes. Is there an easy

Nodejs的运行原理-架构篇

谁说我不能喝 提交于 2019-12-05 15:34:40
前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理。 PS:此系列只做Nodejs的运行原理(架构,libuv,v8 etc),并不介绍Nodejs功能以及使用方法。 本文以两个view来看Nodejs的架构,一个是从模块依赖的角度,另一个是从函数调用的角度。 1.模块依赖 如上图所示: your code 为编辑代码, node.js 核心, Host environment 为宿主环境(提供各种服务,如文件管理,多线程,多进程,IO etc) 1.1node.js 这里重点介绍 ,nodejs组成部分: v8 engine, libuv, builtin modules, native modules 以及其他辅助服务。 v8 engine :主要有两个作用 1.虚拟机的功能,执行js代码(自己的代码,第三方的代码和native modules的代码)。              2.提供C++函数接口,为nodejs提供v8初始化,创建context,scope等。 libuv :它是基于事件驱动的异步IO模型库,我们的js代码发出请求,最终由libuv完成,而我们所设置的回调函数则是在libuv触发。 builtin modules :它是由C++代码写成各类模块

nodejs原理

允我心安 提交于 2019-12-05 14:12:04
即使还没有用nodejs写过什么项目,但是,核心中的核心,原理中的原理,maybe已经掌握到了。 先说nodejs和java对于并发处理上到区别。 java是最熟悉的了,所有人都知道,java在处理并发业务的时候是直接开一个线程去做。如下图所示 即使新开了线程,在并发更高的情况下,还是会出现等待,这是必然的。多个线程的并行运行,cpu会不断的在线程的上下文之间切换,会增加服务器的负担,多线程的创建和删除也会产生内存上的负担和GC的负担。当一个线程去完成一个业务的时候如果遇到IO操作还是会让线程进行阻塞,也就是说拜托不了任务同步的问题。 但是nodejs的处理方式是孑然不同,因为它的特点是单线程,异步IO,事件循环。 先说nodejs的单线程。关于它的单线程,有一个最直观的理解就是开发者不能自己新建线程去处理一个任务,对于web应用所有的请求的处理都是在一个主线程中完成的,所有请求的处理和请求的响应都是在一个线程中。这样的话当前的cpu只对当前的任务进行处理,不会同时处理多个请求,自然也就不需要像java那样需要锁,加锁,解锁,死锁各种问题。但是你也不能理解成进来一个请求就处理,处理完之后再处理下一个请求,这样的话也太low了吧。这里就提到了异步io 异步io的意思就是当主线程处理请求遇到io操作的时候不会由主线程自己去完成(因为这样会造成主线程的阻塞),而是交给libuv

Is libuv just a wrapper on libev on POSIX systems?

↘锁芯ラ 提交于 2019-12-05 13:19:50
I am really confused between libev and libuv. Is libuv just a wrapper on libev on POSIX systems? If not where does it differ? No longer, since libuv-v0.9 Here is the libuv github issue which tracked the removal of libev from libuv. The reasons for removal are, to quote from the above linked issue: In case any project watchers are wondering, libev served us well but: It only supports level-triggered I/O. On Linux, we want to use edge-triggered mode - it cuts down the number of syscalls by a substantial margin. libev's inner loop does a lot of things we don't really need. Gutting the inner loop

《Node.js》之事件处理机制以及事件环机制(二)

早过忘川 提交于 2019-12-05 11:47:49
传统服务器与Node.js的比较 传统的服务器在面临高并发的场景时,会使用多线程方案,服务器会为客户端的请求分配一个线程,使用同步的I/O,系统通过线程切换来弥补同步I/O调用过程中的时间开销。Apache就是使用的这种方式,由于I/O操作会消耗比较多的时间,通过多线程的方式解决高并发的问题,难以实现高性能,但是可以实现很复杂的逻辑。 但是大多数网站的服务端不需要太多的计算处理,收到请求之后交给其他的服务进行处理,将处理结果返回给客户端。因此Node.js会针对这样的应用场景使用单线程模型进行处理,并不会为每一个客户端的请求创建一个线程,而是通过一个线程处理所有的请求,然后对I/O操作进行异步处理,这样的方式可以减少创建、销毁线程以及线程切换消耗的时间。 Node.js的事件处理机制 在Node.js中采用了非阻塞的I/O机制,在这种机制下应用程序所进行的处理都不会再结束之前阻碍其他处理的进行。这些处理都是相互独立的,每一个事件处理完成之后,会执行一个回调函数。 Node.js在主线程里面维护了一个事件队列,当接到请求之后就会将请求作为一个事件放在这个事件队列中,然后继续接受其他的请求。当主线程空闲的时候就开始循环事件队列。检查队列中是否有需要处理的事件,如果需要处理的事件不是I/O任务,就亲自处理,通过回调函数返回到上层调用。如果是I/O任务