我正在写一个多线程的程序。主线程不断地接收网络数据,数据量比较大,所以使用子线程来处理数据。
接收到的数据是一个100字节的数据包。每次收到数据包时,我都会创建一个100字节的SharedArrayBuffer,并通过postMessage()将其发送给子线程。但是主线程接收数据的速度非常快,需要频繁地调用postMessage来通知子线程,这导致CPU usage...affecting主线程的响应速度很高。
所以我在想,如果SharedArrayBuffer可以动态增长,接收到的数据会不断地附加到SharedArraybuffer的末尾,我只通知子线程一次,这样子线程也可以访问数据。
我想问一下如何动态增加SharedArrayBuffer的长度。我试图以链接的方式实现它,将一个SharedArrayBuffer对象存储在另一个SharedArrayBuffer对象中,但浏览器不允许这样做。
发布于 2018-10-10 12:14:01
我想问一下如何动态增加SharedArrayBuffer的长度。
来自MDN web docs (重点是我的)。
“SharedArrayBuffer对象用于表示通用的、固定长度的原始二进制数据缓冲区,类似于ArrayBuffer对象,但在某种程度上可用于在共享内存上创建视图。”
固定长度意味着你不能调整it...so的大小,它没有resize()方法也就不足为奇了。
(注意:我确实想到了一件事,那就是我相信SharedArrayBuffer有一种非常新的能力可以在WebAssembly中作为使用,它有一个grow_memory运算符。我认为利用这一点将是非常困难的,如果它是可能的,如果它是可能的,那么很可能在许多浏览器中都不支持它。)
我曾尝试以链接的方式实现它,将SharedArrayBuffer对象存储在另一个SharedArrayBuffer对象中,但浏览器不允许这样做。
不是的。你只能写数字。
看起来您可以使用一个数字来索引SharedArrayBuffers表,并以这种方式将它们链接起来。
因此,无论您做什么,无论哪个线程决定更新共享缓冲结构,都需要以某种方式通知其他线程更新。为了使该通知能够传输SharedArrayBuffers,它必须使用postMessage来完成此操作。
您是否考虑过在开始时尝试分配一个更大的SharedArrayBuffer,并将其视为circular buffer,以便主线程以“生产者/消费者”模式读出子线程正在进行的写操作?
如果你坚持实现大小调整,你可以考虑让缓冲区的某一部分保留一个“过时”的指示器,并且必须从调整它大小的线程请求一个新的指示器。您必须使用同步来控制这一点。如果你制作了一个小样本来做这件事,它可能会成为一个很好的技术article...and如果你对小样本有问题,它将是这里进一步问题的一个很好的基础。
发布于 2020-11-12 22:18:44
没有办法调整大小,只能通过类型化数组进行复制。
但是直到RAM被实际使用,才实际分配ram。在Node.js (v14.14.0)下,您可以看到ram使用率是如何随着缓冲区的填满而逐渐增加的,或者如果使用array.fill,它基本上是如何立即被使用的。
const sharedBuffer = new SharedArrayBuffer(512 * 1024 * 1024)
const array = new Uint8Array(sharedBuffer)
// array.fill(1) // Causes ram to be allocated right awayhttps://stackoverflow.com/questions/52684936
复制相似问题