NodeJs Worker Custom

agnusdei·2023년 7월 5일
0
post-custom-banner
// Importing required modules and functions
import fs from 'fs';
import { join } from 'path';
import { exit } from 'process';
import { Worker, isMainThread, workerData } from 'worker_threads';
import { upload } from './upsert';

// Define the directory path for the files
const directory = join(__dirname, '..', process.env.FOLDER_NAME || 'data');

// Read the file names in the directory
const fileNames = fs.readdirSync(directory);

// Define the number of threads to use, defaulting to 4
const THREAD_COUNT = process.env.THREAD_COUNT ? +process.env.THREAD_COUNT : 4;

// The main function that performs the file processing
function main() {
    // Check if there are any files to process
    if (fileNames.length < 0) {
        console.log('파일이 없습니다. 업로드를 종료합니다.'); // Print a message if no files are found and exit
        exit(1);
    }

    // Iterate over each file in the directory
    for (const dir of fileNames) {
        if (isMainThread) {
            const threads = new Set<Worker>();
            
            // Read the content of the current file
            const content = fs.readFileSync(join(__dirname, '..', process.env.FOLDER_NAME || 'data', dir), 'utf-8');
            
            // Count the number of lines in the file
            const dataLength = content.split('\n').length;

            // Create worker threads for parallel processing
            for (let i = 0; i < THREAD_COUNT; i++) {
                const start = Math.floor(dataLength / THREAD_COUNT) * i;
                const end = Math.floor(dataLength / THREAD_COUNT) * (i + 1);

                // Create a new worker thread and provide it with necessary data
                threads.add(new Worker(__filename, {
                    workerData: { filename: dir, lines: content.split('\n').slice(start, end) },
                }));
            }

            // Handle events from worker threads
            for (const worker of threads) {
                worker.on('error', (err) => {
                    console.error(err);
                });
                worker.on('message', (message) => {
                    // Handle the message received from the worker if needed
                });
            }
        } else {
            // Invoke the upload function in the worker thread with the provided data
            upload(workerData.filename, workerData.lines);
        }
    }
}

// Call the main function to start the processing
main();
post-custom-banner

0개의 댓글