0

express-fileuploadファイルの一括アップロードを処理するために使用しています。bulk-uploadサーバーへの一括アップロードを処理する API を作成しましたが、現在は機能しています。

ここで、アップロードを開始する前に各ファイルに長時間のタスクを実行したいという新しい要件があり、各ファイルの長時間のタスクがすべて終了したら、アップロードを実行したいと考えています。

コードのコメント欄に、それぞれのタスクを実行するための何かを追加したいと考えています。最初に、 for ループを使用してから、ループ内で次のような大きなタスクを実行したいと考えています。

...
let data = []
_.forEach(_.keysIn(req.files.photos), (key) => {
let photo = req.files.photos[key]
startBigTask(photo) // function to run each big task
}
// when all tasks on each one have done, I'll run the upload.
_.forEach(_.keysIn(req.files.photos), (key) => {
    let photo = req.files.photos[key]
    photo.mv("./uploads/" + photo.name)
    data.push({
        name: photo.name,
        mimetype: photo.mimetype,
        size: photo.size,
    })
})
...

ただし、それぞれに時間がかかりすぎます。特に、順番に実行されているため、他の実行が停止します。

大きなタスクを高速化するためにマルチスレッドの方法を使用してstartBigTask実行できる方法はありますか?worker thread

これはコード全体です:

const express = require("express")
const bodyParser = require("body-parser")
const fileUpload = require("express-fileupload")
const cluster = require("cluster")
const totalCPUs = require("os").cpus().length
const _ = require("lodash")

if (cluster.isMaster) {
    for (let i = 0; i < totalCPUs; i++) {
        cluster.fork()
    }
    cluster.on("exit", (worker, code, signal) => {
        cluster.fork()
    })
} else {
    const app = express()
    app.use(
        fileUpload({
            createParentPath: true,
        })
    )
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({ extended: true }))
    const port = process.env.PORT || 3000
    app.listen(port, () => {
        console.log(`App listening on port ${port}`)
    })
    app.post("/bulk-upload", async (req, res) => {
        try {
            if (!req.files) {
                res.send({
                    status: false,
                    message: "No file uploaded",
                })
            } else {
                let data = []

                // do some extra big task on each file using workers, when extra task on each file is done, upload it to sever. How should I do here?

                _.forEach(_.keysIn(req.files.photos), (key) => {
                    let photo = req.files.photos[key]
                    photo.mv("./uploads/" + photo.name)
                    data.push({
                        name: photo.name,
                        mimetype: photo.mimetype,
                        size: photo.size,
                    })
                })
                res.send({
                    status: true,
                    message: "Files are uploaded",
                    data: data,
                })
            }
        } catch (err) {
            res.status(500).send(err)
        }
    })
}
4

0 に答える 0