最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

节点集群fork经常执行代码

运维笔记admin13浏览0评论

节点集群fork经常执行代码

节点集群fork经常执行代码

我有要在不同线程中执行的作业(函数)。因此我创建了一个实用程序函数:

import {cpus} from "os"
import cluster from 'cluster'

export default function runInThread(func: Function, useAllCores = false, numThreads = useAllCores ? cpus().length : 1) {
    if(cluster.isMaster) {
        for(let i = 0; i < numThreads; i++) {
            cluster.fork()
        }
    } else {
        func()
    }
}

然后我想执行这样的工作:

import runInThread from "../helpers/threading"
import job1 from "./job1"
import job2 from "./job2"

let jobs = [
    job1, 
    job2
]

jobs.forEach(job => runInThread(job))

示例作业是:

export default function job1() {
    console.log('job1')
}

export default function job2() {
    console.log('job2')
}

不幸的是,它们似乎被执行了两次,因为输出是:

job1
job1
job2
job2

所以似乎每个工作分两次......?

回答如下:

主要思想 - 每个线程(fork)都像主机那样具有某些功能。在示例中,这只是函数名称,但在实际工作中,您可以为函数生成一些id,并将其作为env变量传递给worker。

import {cpus} from "os"
import cluster from 'cluster'

export default function runInThread(func: Function, useAllCores = false, numThreads = useAllCores ? cpus().length : 1) {
    if(cluster.isMaster) {
        for(let i = 0; i < numThreads; i++) {
            cluster.fork({FUNC_ID: func.name})
        }
    } else {
       if (process.env.FUNC_ID === func.name) {
         func()
       }
    }
}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论