Node.js C 插件按uv_queue_work排队



我在libUV的帮助下创建了一个C节点.js插件,使插件异步。

我为此排了好几队。

代码是这样的,loopArray用于存储这些队列:

//... variables declarations
void AsyncWork(uv_work_t* req) {
    // ...
}
void AsyncAfter(uv_work_t* req) {
    // ...
}
Handle<Value> RunCallback(const Arguments& args) {
    // ... some preparation work
    int loopNumber = (rand() % 10);
    int status = uv_queue_work(loopArray[loopNumber], &baton->request, AsyncWork, AsyncAfter);
    uv_run(loopArray[loopNumber]);
    return Undefined();
}

extern "C" {
    static void Init(Handle<Object> target) {
        int i = 0;
        for (i = 0; i< 10; i++){
            loopArray[i] = uv_loop_new();
        }           
        target->Set(String::NewSymbol("callback"), FunctionTemplate::New(RunCallback)->GetFunction());
    }
}
NODE_MODULE(addon, Init)

问题是,即使我为要求 CPU 的任务创建了 10 个队列。 node.js 在处理其中一个队列时不会在任务之间切换。是由于node.js的单线程性质吗?

是这样,uv_thread_create对坐姿有帮助吗?

我找不到任何代码示例,所以我不确定如何使用它。

谢谢!

这是node架构背后的主要思想:使用函数调用(back)s和主事件循环来运行它们,而不是使用线程并行处理多个作业。

如果要处理作业队列,最好的方法是一次执行一个作业。在系统上利用多个 CPU 内核是由多个节点实例而不是线程完成的。为此,我们有child_process和群集节点模块。

当您创建多个线程时,假设您要运行 10 个线程进行工作,如果您的系统有 8 个 CPU 内核,则通过向操作系统的调度程序提供不必要的工作来扼杀性能。这是您应该考虑的非常重要的一点。如果您有 8 个内核,则如果要获得最大性能,则不应并行创建超过 8 个线程。

对于节点,我们不会尝试在一个进程中创建多个队列或线程。相反,我们采用多个节点进程,同样每个内核最多一个进程。

如果您要处理已经存在的队列。在这种工作中,你不需要你的 C 模块是异步的。

当我们有来自外部的作业(如 Web 服务器上的 http 请求)时,我们希望异步行为。在Web服务器上,我们的工作以我们无法控制的方式进行。人们和其他机器随时连接到我们的服务器,我们希望尽快回答每一个。为此,我们不希望任何请求阻止其他人。我们需要并行处理尽可能多的请求。

但是,如果您在数据库表的行上运行或对一长串参数进行一些计算,那么您将从事一种非常不同的业务。你面前有你的工作队列,等待你的管理方式。您的工作不会以您无法控制的方式进入您的系统。在这种业务中,为了达到最终的效率并达到最高的利润,您应该一个接一个地运行作业,而无需在它们之间进行任何切换。并行性仅在具有多个内核时才好,并且要使用它们,节点的最佳实践是使用多个节点进程。

最新更新