Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Node.JS中有没有一种在worker/threads/something之间共享内存的方法?_Multithreading_Node.js_Parallel Processing_Fork - Fatal编程技术网

Multithreading 在Node.JS中有没有一种在worker/threads/something之间共享内存的方法?

Multithreading 在Node.JS中有没有一种在worker/threads/something之间共享内存的方法?,multithreading,node.js,parallel-processing,fork,Multithreading,Node.js,Parallel Processing,Fork,我有一个节点应用程序,它访问一个静态的、大的(>100M)、复杂的内存数据结构,接受查询,然后通过HTTP将数据的一小部分提供给客户端 大多数问题都能在十分之一秒内得到回答。诺德万岁 但是,对于某些查询,搜索此数据结构需要几秒钟。这很糟糕,因为其他人都得等 为了更有效地为客户服务,我想使用某种并行性 但是,因为这个数据结构非常大,我想在工作线程或其他线程之间共享它,所以我不会消耗数百兆字节。这将是非常安全的,因为数据结构不会被写入。任何其他语言中的典型“fork()”都可以做到这一点 然而,据我

我有一个节点应用程序,它访问一个静态的、大的(>100M)、复杂的内存数据结构,接受查询,然后通过HTTP将数据的一小部分提供给客户端

大多数问题都能在十分之一秒内得到回答。诺德万岁

但是,对于某些查询,搜索此数据结构需要几秒钟。这很糟糕,因为其他人都得等

为了更有效地为客户服务,我想使用某种并行性

但是,因为这个数据结构非常大,我想在工作线程或其他线程之间共享它,所以我不会消耗数百兆字节。这将是非常安全的,因为数据结构不会被写入。任何其他语言中的典型“fork()”都可以做到这一点

然而,据我所知,所有在Node中执行并行的标准方法都明确地使这不可能。为了安全起见,他们不想让你分享任何东西

但是有办法吗

背景:

将此数据结构放入数据库或使用memcached之类的方法是不切实际的

WebWorker API库和类似库只允许在Worker中传入和传出短序列化消息

节点的集群使用一个名为“fork”的调用,但它实际上不是现有进程的fork,它正在生成一个新进程。所以再一次,没有共享内存


可能真正正确的答案是使用类似文件系统的共享内存访问,也称为tmpfs或mmap。有一些节点库使mount()和mmap()可用于类似的功能。不幸的是,我们必须在同步查找和读取的基础上实现复杂的数据结构访问。我的应用程序使用dict数组等等。如果不必重新实现所有这些,那就太好了。

使用waf构建是旧式的(节点0.6及以下),使用gyp构建新的构建


您应该看看节点集群()。不清楚这将在没有更多详细信息的情况下帮助您,但这将使用fork在同一台机器上运行多个节点进程。

实际上,node确实支持生成进程。我不确定节点的fork与实际fork的接近程度,但您可以尝试:

顺便说一下:Node不适合这样做并不是真的。它与任何其他语言/web服务器一样适用。您始终可以在不同端口上启动服务器的多个实例,并在前面放置一个代理


如果需要更多内存,请添加更多内存。:)就这么简单。此外,您还应该考虑将所有这些数据放在一个专用的内存数据库中,如Redis或Memcached(如果需要复杂的查询,甚至Couchbase)。您不必再担心复制这些数据。

我尝试编写一个C/C++绑定,从nodejs共享内存访问


仍在进行中(但为我工作),可能有用,如果有错误或建议,请通知我。

大多数web应用程序将大部分时间用于等待网络缓冲区和数据库读取。Node.js被设计成在这个io绑定的工作中出类拔萃。如果您的工作确实受到CPU的约束,那么另一个平台可能会更好地为您服务

有了它的方式

  • 使用process.nextTick(甚至可能是嵌套块)来确保昂贵的CPU工作是正确异步的,并且不允许阻塞线程。这将确保提出昂贵请求的一个客户端不会对所有其他客户端产生负面影响

  • 使用node.js cluster为系统中的每个CPU添加一个工作进程。工作进程都可以绑定到单个HTTP端口,并使用Memcached或Redis共享内存状态。Workers还有一个消息传递API,可用于保持进程内内存缓存同步,但它有一些一致性限制


  • 集群并不是真正的分叉——它只是产生了一个新的进程。我之所以想要fork,是因为我知道共享的内存是不可变的,不会被子节点更改。从您链接到的条目开始:“这些子节点仍然是V8的全新实例。假设每个新节点至少有30毫秒的启动时间和10 MB的内存。也就是说,您无法创建数千个。”在我的例子中,我必须在每个内存中加载>100MB。@NeilK>100MB不是什么大问题(除非通过>100MB您理解10GB:D)。更重要的是保持实例之间的数据同步。为此,我建议使用专用服务器来保存这些数据。请参阅我的答案。正确,它使用child_进程,并生成一个新的节点进程。您可能想考虑使用Purrest.NeXTICK来破坏搜索,并给其他查询一个运行的机会。正如@ FraskIH指出的,100MB真的没什么大不了的,而且您只能获得较慢的启动时间。一旦您的系统启动并运行,您就应该可以了。难道您不能先进行搜索(使用
    process.nextTick
    这样它就不会阻止其余的搜索吗?
    将此数据结构放在数据库中或使用memcached之类的东西是不切实际的。
    什么??从什么时候开始?奇怪:我们正在检查每个项目是否是查询的子集。假设我们有一个字符串“fooqux”,我们想检查该字符串中是否有“ox”。据我所知,用普通的数据库操作无法有效地做到这一点。但是,如果您可以将其作为普通数据结构访问,那么就非常容易了。然后对大量数据进行排序和排序,这些都是指向更多数据的“指针”,除非我们在数据结构中有它们,否则同样是不切实际的。@NeilK首先:您应该告诉我们512MB的限制,数据实际上是208MB,而不是100MB。这是一个很大的区别。第二:有数百种工具可以完成您想要做的事情(我正在谈论您的字符串示例,因为您在这里也没有提供足够的详细信息)。也许你试图使用错误的工具?例如,您可以看看ApacheSolr。最后是普通数据