如何动态增加SharedArrayBuffer的大小

时间:2018-10-07 02:18:45

标签: javascript sharedarraybuffer

我正在编写一个多线程程序。主线程不断接收网络数据,并且数据量相对较大,因此使用子线程来处理数据。

接收到的数据是一个100字节的数据包。每次收到数据包时,我都会创建一个100字节的SharedArrayBuffer并将其通过postMessage()发送到子线程。但是主线程接收数据的速度非常快,因此有必要频繁调用postMessage来通知子线程,这会导致CPU使用率过高...影响主线程的响应速度

所以我在想,如果SharedArraybuffer可以动态增长,那么接收到的数据会不断添加到SharedArrayBuffer的末尾,我只会通知子线程一次,以便子线程也可以访问数据。

我想问一下如何动态增加SharedArrayBuffer的长度。我试图以链接的方式实现它,将SharedArrayBuffer对象存储在另一个SharedArrayBuffer对象中,但是浏览器不允许这样做。

2 个答案:

答案 0 :(得分:0)

  

我想问一下如何动态增加SharedArrayBuffer的长度。

来自MDN web docs (强调我的)

  
    

”“ SharedArrayBuffer对象用于表示通用的,固定长度的固定长度原始二进制数据缓冲区,与ArrayBuffer对象类似,但是可以用来创建视图在共享内存上。”

  

固定长度意味着您无法调整它的大小...因此它没有resize()方法也就不足为奇了。

(注意:虽然我确实想到了一件事情,但我认为SharedArrayBuffer具有一种非常新的功能,可以在WebAssembly中用作"linear memory",它具有一个grow_memory运算符。想像一下,如果有可能的话,利用这一点将非常困难,并且如果可能的话,许多浏览器将不支持。)


  

我试图以链接的方式实现它,将一个SharedArrayBuffer对象存储在另一个SharedArrayBuffer对象中,但是浏览器不允许这样做。

不。您只能写数字。

似乎可以使用数字索引到SharedArrayBuffers表中,并以这种方式链接它们。但是随后,您不得不担心如何在线程之间共享该表-同样的问题。

因此,无论您做什么,无论哪个线程做出更新共享缓冲结构的决定,都需要以某种方式通知其他更新。为了使该通知能够传输SharedArrayBuffers,必须使用postMessage来完成。

您是否考虑过尝试分配一个更大的SharedArrayBuffer开头,并将其像circular buffer一样对待,以便主线程以“生产者/消费者”模式从子线程所做的写操作中读出内容?

如果您坚持要实现调整大小,则可以考虑让缓冲区的某个部分容纳一个指示符,指出该指示符“过时”,并且必须从调整大小的线程中请求一个新的指示符。您必须通过同步来控制它。如果您制作了一个用于执行此操作的小样本,则可能会写出一篇不错的技术文章……如果您对小样本有疑问,则可以为此处的其他问题打下良好的基础。

答案 1 :(得分:0)

没有办法调整大小,只能通过类型化数组进行复制。

但实际上没有分配RAM,直到实际使用ram为止。在Node.js(v14.14.0)下,您可以看到内存使用率随着填充缓冲区的使用而逐渐增加,或者如果使用array.fill则基本上可以立即使用。

const sharedBuffer = new SharedArrayBuffer(512 * 1024 * 1024)
const array = new Uint8Array(sharedBuffer)

// array.fill(1) // Causes ram to be allocated right away