नोडज में थ्रेड कैसे बनाएं


91

क्या एक बार में कई तरीके चलाने के लिए धागे बनाने का कोई तरीका है?

इस तरह, यदि कोई भी विधि अन्य सभी धागों के बीच में विफल हो जाती है तो उसे मार दिया जाना चाहिए।

जवाबों:


94

हर नोड.जेएस प्रक्रिया डिजाइन द्वारा एकल पिरोया गया है। इसलिए कई सूत्र प्राप्त करने के लिए, आपके पास कई प्रक्रियाएँ होनी चाहिए (जैसा कि कुछ अन्य पोस्टरों ने बताया है, ऐसे पुस्तकालय भी हैं जिनसे आप लिंक कर सकते हैं, जो आपको नोड में थ्रेड्स के साथ काम करने की क्षमता प्रदान करेंगे, लेकिन उन पुस्तकालयों के बिना ऐसी कोई क्षमता मौजूद नहीं है। । द्वारा शॉन विन्सेंट संदर्भित जवाब देखें https://github.com/audreyt/node-webworker-threads )

आप अपनी मुख्य प्रक्रिया से बाल प्रक्रियाएँ शुरू कर सकते हैं जैसा कि यहाँ दिखाया गया है। नोड्स दस्तावेज: http://nodejs.org/api/child_process.html । इस पृष्ठ पर उदाहरण बहुत अच्छे हैं और बहुत सीधे हैं।

आपकी मूल प्रक्रिया तब शुरू हुई किसी भी प्रक्रिया पर करीबी कार्यक्रम देख सकती है और फिर आप जिस अन्य प्रक्रिया को बंद करने की रणनीति की बात कर रहे हैं उसे प्राप्त करने के लिए शुरू की गई अन्य प्रक्रियाओं को बंद कर सकते हैं।

इसे भी देखें: मल्टी-कोर मशीनों पर Node.js


प्रक्रियाएं एक समय में समानांतर और अनुक्रमिक चल सकती हैं?
user87267867 12

2
बच्चे की प्रक्रिया माता-पिता की प्रक्रिया से स्वतंत्र होती है। उनके पास अपना मेमोरी स्पेस, पीआईडी ​​और निष्पादन समय है। यकीन नहीं है कि आप अनुक्रमिक से क्या मतलब है, लेकिन हाँ, वे समानांतर में चलेंगे और निष्पादन के लिए ओएस द्वारा अलग से निर्धारित किए जाएंगे।
ब्रायन

बाल प्रक्रिया के रूप में उपयोगकर्ता परिभाषित कार्यों को कैसे कॉल करें?
user87267867

मैं फंक्शन एबीसी () {}
user8726786767

2
हुह, उस पुस्तकालय के बारे में पता नहीं था, लेकिन यह एलेक्स मिल्स की टिप्पणी के अनुसार लगता है कि आप नोड में कुछ थ्रेडिंग का काम कर सकते हैं। कहा जा रहा है, अगला सवाल आपको होना चाहिए। । । नोड को जमीन से मुक्त प्रोग्रामर को जटिलता से डिज़ाइन किया गया था जो थ्रेड्स के साथ आते हैं लेकिन I / O को अवरुद्ध करने के लिए इसी प्रकार के प्रदर्शन का उत्पादन करते हैं। मैं इस तथ्य के लिए अपने जवाब को संपादित करूंगा कि संदर्भित पुस्तकालय का उपयोग करना संभव है।
ब्रायन

34

Node.js के भीतर से मूल थ्रेडिंग करने के लिए कम से कम एक लाइब्रेरी भी है: नोड-वेबवर्क-थ्रेड्स

https://github.com/audreyt/node-webworker-threads

यह मूल रूप से नोड के लिए वेब वर्कर ब्राउज़र एपीआई लागू करता है।


3
यह सही होना चाहिए। उत्तर यह बताता है कि नोड केवल प्रक्रियाएँ ही कर सकता है, लेकिन धागे नहीं, गलत है।
अलेक्जेंडर मिल्स

18

नोड 10.5 से अब बहु सूत्रण समर्थन है , लेकिन यह प्रयोगात्मक है । उम्मीद है कि यह जल्द ही स्थिर हो जाएगा।

निम्नलिखित संसाधनों की जाँच करें:


अपडेट :

नोड v11.7.0 आगे से, आपको --experimental-workerध्वज का उपयोग करने की आवश्यकता नहीं है ।

जारी नोट: https://nodejs.org/en/blog/release/v11.7.0/


9

आप Napa.js. का उपयोग करके मल्टी-थ्रेडिंग प्राप्त कर सकते हैं

https://github.com/Microsoft/napajs

"नापा.जेएस V8 पर निर्मित एक बहु-थ्रेडेड जावास्क्रिप्ट रनटाइम है, जिसे मूल रूप से बिंग में गैर-समझौता किए गए प्रदर्शन के साथ अत्यधिक पुनरावृत्त सेवाओं को विकसित करने के लिए डिज़ाइन किया गया था। जैसा कि यह विकसित होता है, हम सीपीयू-बाउंड कार्यों में Node.js को पूरक करने के लिए उपयोगी पाते हैं। , कई V8 में जावास्क्रिप्ट को क्रियान्वित करने और उनके बीच संचार करने की क्षमता के साथ। नापा.जेएस को नोड.जेएस मॉड्यूल के रूप में उजागर किया जाता है, जबकि इसे बिना नोड के निर्भरता के एक मेजबान प्रक्रिया में भी एम्बेड किया जा सकता है। "


4

यदि आप Rx का उपयोग कर रहे हैं, तो समानांतर निष्पादन में काम को विभाजित करने के लिए rxjs-क्लस्टर में प्लगइन करना आसान है। (अस्वीकरण: मैं लेखक हूं)

https://www.npmjs.com/package/rxjs-cluster


3

मुझे Node.js में वास्तविक मल्टीथ्रेडिंग की आवश्यकता थी और जो मेरे लिए काम करता था वह थ्रेड पैकेज था। यह एक अन्य प्रक्रिया को जन्म देता है, यह स्वयं का Node.js संदेश लूप है, इसलिए वे एक दूसरे को ब्लॉक नहीं करते हैं। सेटअप आसान है और दस्तावेज़ीकरण आपको ऊपर और तेजी से चल रहा है। आपका मुख्य कार्यक्रम और कार्यकर्ता दोनों तरीकों से संवाद कर सकते हैं और ज़रूरत पड़ने पर कार्यकर्ता "धागे" को मार सकते हैं।

चूंकि मल्टीथ्रेडिंग और Node.js एक जटिल और व्यापक रूप से चर्चा का विषय है, ऐसे पैकेज को खोजना काफी कठिन था जो मेरी विशिष्ट आवश्यकता के लिए काम करता हो । रिकॉर्ड के लिए ये मेरे काम नहीं आए :

  • छोटे कार्यकर्ता ने श्रमिकों को काटने की अनुमति दी, लेकिन वे एक ही संदेश लूप साझा करने के लिए लग रहे थे (लेकिन हो सकता है कि मैंने कुछ गलत किया हो - थ्रेड्स में अधिक प्रलेखन था जो मुझे विश्वास दिलाता था कि यह वास्तव में कई प्रक्रियाओं का उपयोग करता है, इसलिए मैं तब तक काम करता रहा जब तक कि यह काम न कर गया)
  • वेबवर्क-थ्रेड्स ने requireउन श्रमिकों के मॉड्यूल की अनुमति नहीं दी, जिनकी मुझे आवश्यकता थी

और यह पूछने के लिए कि मुझे असली मल्टी-थ्रेडिंग की आवश्यकता क्यों है : रास्पबेरी पाई से जुड़े एक आवेदन के लिए और व्यवधान। एक धागा उन व्यवधानों को संभाल रहा है और दूसरा डेटा (और अधिक) के भंडारण का ख्याल रखता है।


1
मैं इस जवाब में डाल महान विचार की सराहना करता हूं!
MLissCetrus

3

नोड्ज 10.5.0 रिलीज़ ने नोड.जेएस में मल्टीथ्रेडिंग की घोषणा की है । सुविधा अभी भी प्रायोगिक है। अब एक नया कार्यकर्ता_थ्रेड्स मॉड्यूल उपलब्ध है।

यदि आप Node.js v10.5.0 या उच्चतर रन करते हैं, तो आप कार्यकर्ता थ्रेड का उपयोग करना शुरू कर सकते हैं , लेकिन यह एक प्रयोगात्मक एपीआई है । यह डिफ़ॉल्ट रूप से उपलब्ध नहीं है: आपको Node.js. को लागू करते समय --experimental- कार्यकर्ता का उपयोग करके इसे सक्षम करने की आवश्यकता  होती है।

यहाँ एक उदाहरण है ES6 और कार्यकर्ता_थ्रेड्स सक्षम, संस्करण 12.3.1 पर परीक्षण किया गया

//package.json

  "scripts": {
  "start": "node  --experimental-modules --experimental- worker index.mjs"
  },

अब, आपको वर्कर से आयात करने की आवश्यकता है वर्कर_थ्रेड्स । नोट: आपको ES6 समर्थन के लिए '.mjs' एक्सटेंशन के साथ js फाइलें घोषित करने की आवश्यकता है ।

//index.mjs
import { Worker } from 'worker_threads';

const spawnWorker = workerData => {
    return new Promise((resolve, reject) => {
        const worker = new Worker('./workerService.mjs', { workerData });
        worker.on('message', resolve);
        worker.on('error', reject);
        worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with 
        exit code ${code}`)));
    })
}

const spawnWorkers = () => {
    for (let t = 1; t <= 5; t++)
        spawnWorker('Hello').then(data => console.log(data));
}

spawnWorkers();

अंत में, हम एक कार्यकर्तासेवा तैयार करते हैं

//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';

// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);

आउटपुट:

npm रन प्रारंभ

Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5

2
क्या यह आपका लेख है: blog.logrocket.com/… ?
सर्व-इन

नहीं..यह नहीं ... मैंने इसे समय में वापस संदर्भित किया था।
प्रियादेशद्र



0

आप Promise.race(देशी I / O रेसिंग समाधान, धागे नहीं) की तलाश कर सकते हैं

आपको मानते हुए (या इस सवाल को खोजने वाले अन्य) असफलता से बचने और आई / ओ संचालन की लागत से बचने के लिए थ्रेड्स दौड़ना चाहते हैं, यह इसे पूरा करने का एक सरल और देशी तरीका है (जो थ्रेड का उपयोग नहीं करता है)। नोड को सिंगल थ्रेडेड किया गया है (इवेंट लूप देखें), इसलिए यदि संभव हो तो थ्रेड्स का उपयोग करने से बचें। अगर मेरे धारणा सही है, तो मैं आप का उपयोग की सलाह देते हैं Promise.raceसाथ setTimeout(लिंक में उदाहरण)। इस रणनीति के साथ, आप उन वादों की एक सूची तैयार करेंगे, जिनमें से प्रत्येक में कुछ I / O ऑपरेशन की कोशिश की जाएगी और यदि कोई त्रुटि है (तो समय समाप्त), वादे को अस्वीकार कर देंगे। Promise.raceबयान पहले संकल्प / अस्वीकृति, जो तुम क्या चाहते हो रहा है के बाद भी जारी है। आशा है कि यह किसी की मदद करता है!


2
इसका धागों से कोई लेना-देना नहीं है। वे सभी एक ही धागे में चलते हैं।
इवान कैरोल

@EvanCarroll - मुझे चेतावनी देने के लिए धन्यवाद कि मैं पर्याप्त स्पष्ट नहीं था। मैंने इसे इस धारणा के साथ पूर्वनिर्मित किया कि कोई व्यक्ति थ्रेड रेसिंग क्यों देख रहा है और नोट किया कि यह नोड के इवेंट लूप में वादों का उपयोग करता है। किसी अन्य भाषा से आ रहा है, यह बहुत संभव है कि आप यह पूरा करना चाहते हैं कि सूत्र क्या करते हैं, लेकिन इवेंट लूप या वादों से परिचित नहीं हैं। मैं यह नोट करना चाहता था कि यह पूरा करने के सरल तरीके हैं कि अगर यह आपका लक्ष्य है। मैंने एक पैरेंटिकल जोड़ा कि यह थ्रेड्स का उपयोग नहीं करता है। मुझे पता है अगर यह बातें साफ करता है।
स्मेहम

यह ओपी मानदंड का जवाब देने के लिए भी लगता है: "अगर किसी भी विधि में विफल रहता है, तो सभी अन्य धागे मारे जा सकते हैं", इसलिए मुझे लगा कि यह प्रासंगिक था।
स्माइथम

Promise.race सभी वादों को क्रमिक रूप से निष्पादित करता है, एक अतुल्यकालिक ऑपरेशन के मामले में एक से दूसरे में स्विच (या एक async फ़ंक्शन के मामले में प्रतीक्षा)।
नागभूषण बद्दी

0

Node.js थ्रेडिंग का उपयोग नहीं करता है। इसके आविष्कारक के अनुसार यह एक प्रमुख विशेषता है। इसके आविष्कार के समय, धागे धीमे, समस्याग्रस्त और कठिन थे। Node.js को एक कुशल सिंगल-कोर विकल्प में जांच के परिणामस्वरूप बनाया गया था। अधिकांश Node.js उत्साही अभी भी तु पुराने तर्क का हवाला देते हैं जैसे कि पिछले 50 वर्षों में धागे में सुधार नहीं हुआ है।

जैसा कि आप जानते हैं, Node.js का उपयोग जावास्क्रिप्ट को चलाने के लिए किया जाता है। पिछले कुछ वर्षों में जावास्क्रिप्ट भाषा भी विकसित हुई है। अब इसमें कई कोर का उपयोग करने के तरीके हैं - यानी थ्रेड्स क्या करते हैं। तो, जावास्क्रिप्ट में प्रगति के माध्यम से, आप अपने अनुप्रयोगों में कुछ मल्टी-कोर मल्टी-टास्किंग कर सकते हैं। user158 बताते हैं कि Node.js इसके साथ थोड़ा खेल रहा है। मैं उस बारे में कुछ नहीं जानता। लेकिन जावास्क्रिप्ट प्रस्ताव देने के लिए Node.js का इंतजार क्यों करें।

Node.js मल्टी-थ्रेडिंग के बजाय जावास्क्रिप्ट मल्टी-थ्रेडिंग के लिए Google। आपको वेब वर्कर्स, प्रॉमिस और अन्य चीजों के बारे में पता चलेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.