我也是最近刚了解到 openmp,立即就想到这可以用 macros 来实现,不过 openmp 是通过共享内存来传递数据,在 JS 里可能得用 SharedArrayBuffer 来减少数据传递的成本,而不是都传消息,我之前用 redux-worker 并行处理大量 JSON 的时候就发现消息传递在处理 JSON 这样的大文本数据时可能会是瓶颈。

还有用模板字符串创建 worker 的话,写 TS 或 FlowType 会比较麻烦,之前我写 worker 就发现得用一个 ES6 的文件作为 worker 入口点,带其他 TS 文件才行,如果用 macros 的话说不定还能顺便解决这个问题。

在这里的评论区跟人讨论了一下:

动态创建 Web Worker 实践指南

把macro提供的函数被调用的地方后面的for循环放到一个新的worker里面。

下面这个类似于 Promise.all ,是并发,不一定并行

#pragma omp parallel sections
  private(i)
{
  #pragma omp section
  for (i=0; i<=n; i++) {
    S1: a[i] = b[i+1]*a[i];
    S2: b[i] = b[i]*coef;
    S3: c[i] = 0.5*(c[i] + a[i]);
  }
  #pragma omp section
  for (i=0; i<n; i++) {
    S4: d[i] = d[i-1] + d[i];
  }
}

不过如果和返回 Promise 的 worker 库结合,就变成并行的了

现在已经有 https://github.com/alewin/useWorker 可以参考了。