微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何 .push() 每个工人的结果到节点 js 中的数组中?

如何解决如何 .push() 每个工人的结果到节点 js 中的数组中?

我非常猛烈地撞到墙上。问题是我在主线程中使用以下形式调用一个函数

const {StaticPool} = require("node-worker-threads-pool");

const friendsTableWorkers = (result) => {

    const pool = new StaticPool({
        size: 8,task: "./worker.js",workerData: result
    })

    const nums = [23,25]
    let buffer = []

    const size = Int32Array.BYTES_PER_ELEMENT*nums.length
    const sharedBuffer = new SharedArrayBuffer(size)
    const sharedArray = new Int32Array(sharedBuffer)

    nums.forEach((num,index) => {
        Atomics.store(sharedArray,index,num);
    })

    pool.exec(sharedArray).then(res => {
        buffer.push( res )
    }).finally(()=>{
        console.log( buffer )
    })

    return buffer 
}

反过来,使用以下形式的固定工作线程池:

const { parentPort,workerData } = require("worker_threads")
const _ = require('lodash')
const { idToEnsembl } = require('./supportFunctionsBackend.js')

function friendSeeker(n) {  
  console.log(n)
  let res = workerData.map(x => x._doc)
  return {
          ensemblGeneId: idToEnsembl(n),nodeidentifier: n,genesetFriends: _.countBy(res,(o) => {
                                      return (o.nodes.includes(n))
                                    }).true}
}
 
parentPort.on("message",(param) => {

  param.forEach( friend => {
    if (typeof friend !== "number") {
      throw new Error("param must be a number.");
    }
    const result = friendSeeker(friend);
    parentPort.postMessage(result);

  })

})

但是,当我运行它时,我得到以下信息:

23
[
  {
ensemblGeneId: 'ENSG00000000003',nodeidentifier: 23,genesetFriends: 2249
  }
]
25

真正的结果应该是:

[
  {
ensemblGeneId: 'ENSG00000000003',genesetFriends: 2249
  },{
ensemblGeneId: 'ENSG00000000005',nodeidentifier: 25,genesetFriends: 321
  }
]

[
  {
ensemblGeneId: 'ENSG00000000005',genesetFriends: 321
  },{
ensemblGeneId: 'ENSG00000000003',genesetFriends: 2249
  }
]

这意味着只有一个工人将他的结果推送到缓冲区数组中。那么,我的问题是,如何让所有工作人员将他们的结果推送到缓冲区数组中?顺序不重要。

非常感谢您提前

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。