const { parentPort } = require("worker_threads"); const { MongoClient } = require("mongodb"); let mongoDB = null; let collectionRewards = null; let collectionFeatures = null async function connect() { const client = new MongoClient('mongodb://localhost:27017'); await client.connect({ maxPoolSize: 100, minPoolSize: 20, maxConnecting: 20, waitQueueTimeoutMS: 0, socketTimeoutMS: 30000, connectTimeoutMS: 10000, retryWrites: false, directConnection: true }); return client.db("test"); }; function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }; (async function() { mongoDB = await connect(); collectionRewards = mongoDB.collection("Rewards"); collectionFeatures = mongoDB.collection("Features"); })(); const rewardsBatch = []; const featuresBatch = []; const fns = { 1: async function (data) { rewardsBatch.push(data); }, 2: function (data) { featuresBatch.push(data); }, 3: async function (data) { const n = performance.now(); await collectionFeatures.insertMany(data, { ordered: false, writeConcern: { w: 0 }, bypassDocumentValidation: true }); console.info("Written!", performance.now() - n); } }; const queue = []; parentPort.on("message", data => { const fn = fns[data.id]; if (!fn) return; queue.push(data); }); setInterval(async () => { const n = performance.now(); for (let i = 0; i < queue.length; i++) { const item = queue[i]; fns[item.id](item.data); }; queue.length = 0; if (rewardsBatch.length) await collectionRewards.insertMany(rewardsBatch, { ordered: false, writeConcern: { w: 0 }, bypassDocumentValidation: true }); if (featuresBatch.length) await collectionFeatures.insertMany(featuresBatch, { ordered: false, writeConcern: { w: 0 }, bypassDocumentValidation: true }); rewardsBatch.length = 0; featuresBatch.length = 0; }, 60000);