我正在使用libuv.我已经阅读了http://nikhilm.github.com/uvbook/processes.html但仍然无法弄清楚如何捕获子进程的stdout以便它在父进程中可用(但不能代替父进程的stdin) ).
我的代码目前是:
#include <stdio.h>
#include <stdlib.h>
#include "../../libuv/include/uv.h"
uv_loop_t *loop;
uv_process_t child_req;
uv_process_options_t options;
uv_pipe_t apipe;
void on_child_exit(uv_process_t *req, int exit_status, int term_signal) {
fprintf(stderr, "Process exited with status %d, signal %d\n", exit_status, term_signal);
uv_close((uv_handle_t*) req, NULL);
}
uv_buf_t alloc_buffer(uv_handle_t *handle, size_t len) {
printf("alloc_buffer called\n");
uv_buf_t buf;
buf.base = malloc(len);
buf.len = len;
return buf;
}
void read_apipe(uv_stream_t* stream, ssize_t nread, uv_buf_t buf) {
printf("read %li bytes from the child process\n", nread);
}
int main(int argc, …Run Code Online (Sandbox Code Playgroud) 在Windows nodejs插件中,我创建了一个用于接收消息的窗口.
Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS
...
CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个wndproc函数.
Local<Function> wndProc;
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
// pack up the arguments into Local<Value> argv
wndProc->Call(Context::GetCurrent()->Global(), 3, argv);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要抽取消息.通常,你会做类似的事情
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)
...但这不起作用,因为它只会阻止v8事件循环.
如何以不阻止v8的方式提取Windows消息,并允许我在窗口收到消息时调用JS函数?
我假设libuv将扮演一个角色,但我不确定如何安全地从C运行在一个单独的线程上调用JS函数,特别是因为uv_async_send不保证每次调用它时都会调用一个回调,我需要确保每次收到窗口消息时都会调用我的JS回调.
使用该uv_run函数在libuv中运行事件循环时,会出现一个与以下值一起使用的"mode"参数:
UV_RUN_DEFAULT
UV_RUN_ONCE
UV_RUN_NOWAIT
Run Code Online (Sandbox Code Playgroud)
前两个是显而易见的.UV_RUN_DEFAULT运行事件循环,直到没有更多事件,并UV_RUN_ONCE处理循环中的单个事件.但是,UV_RUN_NOWAIT似乎不是一个单独的模式,而是一个可以与其他两个值之一进行OR运算的标志.
默认情况下,此函数会阻塞,直到事件完成处理,并UV_RUN_NOWAIT使其无阻塞,但我可以在其上找到的任何文档都在那里结束.我的问题是,如果你运行事件循环非阻塞,如何处理回调?
libuv事件模型是单线程的(reactor模式),所以我假设它需要阻塞才能调用回调,但如果主线程被占用,事件处理后会发生什么?在libuv再次控制主线程之前,回调是否会"排队"?或者是否会在另一个线程上调度回调?
这是关于系统级优化的概念性查询.通过阅读NodeJS文档,我的理解是管道可以方便地对流进行流量控制.
背景:我有麦克风流进来,我想避免额外的复制操作,以节省整体系统MIPS.据我所知,对于音频流来说,即使在引擎盖下有记忆镜,也不会花费大量的MIPS,但我也计划在30fps和UHD分辨率下以相机帧流式传输.以30fps制作UHD分辨率像素数据的多个副本是非常低效的,因此需要一些关于此的建议.
示例代码:
var spawn = require('child_process').spawn
var PassThrough = require('stream').PassThrough;
var ps = null;
//var audioStream = new PassThrough;
//var infoStream = new PassThrough;
var start = function() {
if(ps == null) {
ps = spawn('rec', ['-b', 16, '--endian', 'little', '-c', 1, '-r', 16000, '-e', 'signed-integer', '-t', 'raw', '-']);
//ps.stdout.pipe(audioStream);
//ps.stderr.pipe(infoStream);
exports.audioStream = ps.stdout;
exports.infoStream = ps.stderr;
}
};
var stop = function() {
if(ps) {
ps.kill();
ps = null;
}
};
//exports.audioStream = audioStream;
//exports.infoStream = infoStream;
exports.startCapture …Run Code Online (Sandbox Code Playgroud) 我正在学习Node.js的体系结构。我有以下问题。
我目前正在重写一个非常古老的mmorpg的服务器端,我正在寻找一个好的开源网络库与C/C++一起使用.
由于客户端已经存在,我不能使用任何强制执行某种数据包结构或通信的库(例如,RakNet).
服务器将主要在三个不同的端口上使用UDP.
在网上搜索后,我发现了boost :: asio和libuv.
boost :: asio看起来像是一个成熟的选项,因为我已经使用了boost,但是我读到他们的UDP实现有点差,而且由于使用了一些锁定它无法实现多核处理器的最大性能epoll的.
libuv似乎很棒,是事件驱动的,由一个大项目支持,但目前没有这样的项目使用它,所以我对使用它有疑问.
你觉得怎么样?我可以在这样的项目中使用libuv,还是我必须使用boost :: asio?我也对其他建议持开放态度(他们需要跨平台,我已经放弃了enet,libevent和libev).
在libuv中,最终可能会因为工作量太大或代码错误而将工作线程占用.是否有一个简单的函数可以检查工作线程或线程队列的运行状况?它不一定是100%确定性的,毕竟不可能确定工作线程是挂在慢速代码还是无限循环上.
因此,以下任何启发式方法都会很好:
尚未处理的排队项目数.如果这个太大,则可能意味着工作线程忙或挂.
libuv是否有任何线程查杀机制,如果工作线程在n秒内没有检查,它会被终止吗?
我在学习Node.js
我在 libuv 官方文档中找到了这个注释 -
\n\n\xe2\x80\x9clibuv使用 athread pool使asynchronous file I/O操作成为可能,但是network I/O始终在单个线程中执行,每个循环\xe2\x80\x99s 线程。\xe2\x80\x9d
我的问题是针对以下声明(来自非官方资源)-
\n\n\n\n\n“如今\xe2\x80\x99s操作系统已经为许多I/O任务提供了异步接口(例如Linux上的AIO)。只要有可能,libuv就会使用这些异步接口,从而避免使用线程池。”
\n
-- 此语句对于异步是否正确file I/O operations,或者仅适用于Network I/O?
所以我刚刚发现就 C 库而言,libuv是一个相当小的库(与 FFmpeg 相比)。在过去的 6 个小时里,我通读了源代码,以便更深入地了解事件循环。但仍然没有看到“非阻塞”在哪里实现。在代码库中调用某些事件中断信号或诸如此类的东西。
我已经使用 Node.js 超过 8 年了,所以我熟悉如何使用异步非阻塞事件循环,但我从未真正研究过它的实现。
我的问题是双重的:
因此,我们从一个 hello world 示例开始。所有需要的是:
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
int main() {
uv_loop_t *loop = malloc(sizeof(uv_loop_t));
uv_loop_init(loop); // initialize datastructures.
uv_run(loop, UV_RUN_DEFAULT); // infinite loop as long as queue is full?
uv_loop_close(loop);
free(loop);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我一直在探索的关键功能是uv_run. 该uv_loop_init函数本质上是初始化数据结构,所以我不认为那里有太多花哨的东西。但真正的魔力似乎有发生uv_run,地方。来自 libuv 存储库的一组高级代码片段在此 gist 中,显示了uv_run函数调用的内容。 …
有没有办法在Node.js中调用以确定事件循环队列中的定时器数量?我有一个带有大量超时的图书馆,而不是使用某种内部簿记系统自己跟踪它们,如果我可以问V8或Libuv或其他什么,有多少计时器,这将是很好的.
这可能吗?
libuv ×10
node.js ×6
v8 ×4
c ×3
c++ ×3
javascript ×2
asynchronous ×1
boost ×1
boost-asio ×1
event-loop ×1
evented-io ×1
events ×1
io ×1
nonblocking ×1
pipe ×1
settimeout ×1
spawn ×1
winapi ×1