首页 > 解决方案 > 是否存在由工作线程填充的阻塞 ArrayBuffer?

问题描述

我想使用ion-js,但它是字符串或 ArrayBuffers 上的同步库,而不是 Stream 或 ReadableStream。

我想使用 worker_threads、SharedArrayBuffer 和 Atomics 来创建一个填充在后台线程中并阻塞等待字节的 ArrayBuffer。

class BlockingArrayBuffer implements ArrayBuffer {
  constructor(
    private readonly dataBuffer: Uint8Array,
    private readonly availableBytes: Int32Array,
  ) {  }

  get byteLength(): number {
    return this.dataBuffer.byteLength;
  }

  slice(begin: number, end: number = this.byteLength): ArrayBuffer {
    // calls Atomics.wait till availableBytes is greater than begin and end.
    this.blockTillAvailable(Math.max(begin, end));
    return this.dataBuffer.slice(begin, end);
  }
}

有一个未显示的工作线程读取流并更新支持 dataBuffer 和 availableBytes 的两个共享数组缓冲区。

当我直接调用 slice 时,这实际上有效。

const {dataBuffer, availableBytes} = await makeWorker();
const blocking = new BlockingArrayBuffer(dataBuffer, availableBytes);
blocking.slice(0, 10); // completes quickly.
blocking.slice(0);     // blocks till buffer is full.

但是,当我用类型化数组包装阻塞数组时它不起作用

console.log(blocking.slice(0)); // prints  filled array
console.log(new Uint8Array(blocking).slice(0)); // Uint8Array(0) []

标签: javascriptsharedarraybufferamazon-ion

解决方案


推荐阅读