Nodejs'de iş parçacığı nasıl oluşturulur


Yanıtlar:


95

Her node.js işlemi, tasarım gereği tek iş parçacıklıdır. Bu nedenle, birden çok iş parçacığı elde etmek için birden çok işleminiz olması gerekir (Diğer bazı posterlerin de belirttiği gibi, size Düğümde iş parçacıklarıyla çalışma yeteneği sağlayacak, buna bağlanabileceğiniz kitaplıklar da vardır, ancak bu kitaplıklar olmadan böyle bir yetenek yoktur. . Shawn Vincent'ın https://github.com/audreyt/node-webworker-threads referansındaki cevabına bakın )

Alt işlemleri, burada node.js belgelerinde gösterildiği gibi ana işleminizden başlatabilirsiniz: http://nodejs.org/api/child_process.html . Örnekler bu sayfadaki oldukça iyi ve oldukça basit.

Üst süreciniz daha sonra başlattığı herhangi bir süreçte kapanış olayını izleyebilir ve daha sonra bahsettiğiniz tek başarısız tüm durdurma stratejisi türüne ulaşmak için başlattığınız diğer işlemleri kapatmaya zorlayabilir.

Ayrıca bkz: çok çekirdekli makinelerde Node.js


süreçler aynı anda paralel ve sıralı çalışabilir mi?
user87267867

2
Alt süreçler ana süreçten bağımsızdır. Kendi hafıza alanlarına, PID'lerine ve yürütme sürelerine sahiptirler. Sıralı ile ne demek istediğinizden emin değilim, ancak evet, paralel olarak çalışacaklar ve işletim için ayrı ayrı programlanacaklar.
Brian

kullanıcı tanımlı işlevler çocuk süreç olarak nasıl çağrılır?
user87267867

Abc () {} işlevini çağırmak için bir çocuk süreci nasıl oluşturabilirim
user87267867

2
Huh, bu kütüphanenin farkında değildim ama Alex Mills'in yorumuna göre Node'da bazı iş parçacığı açma işi yapabileceğiniz gibi görünüyor. Olduğu söyleniyor, bir sonraki soru yapmalısın. . . Düğüm, iş parçacıklarıyla gelen karmaşıklıktan özgür programcılara kadar tasarlanmıştır, ancak G / Ç'yi engellemek için benzer türde performans sağlar. Başvurulan kitaplığı kullanarak bunun mümkün olduğunu hesaba katmak için cevabımı düzenleyeceğim.
Brian



9

Napa.js kullanarak çoklu iş parçacığı elde edebilirsiniz.

https://github.com/Microsoft/napajs

"Napa.js, başlangıçta Bing'de ödünsüz performansla yüksek düzeyde yinelemeli hizmetler geliştirmek için tasarlanmış olan, V8 üzerinde oluşturulmuş çok iş parçacıklı bir JavaScript çalışma zamanıdır. Geliştikçe, CPU'ya bağlı görevlerde Node.js'yi tamamlamayı yararlı buluyoruz , JavaScript'i birden çok V8 izolatında çalıştırma ve bunlar arasında iletişim kurma yeteneği ile. Napa.js, bir Node.js modülü olarak açığa çıkarılırken, Node.js bağımlılığı olmayan bir ana bilgisayar işlemine de yerleştirilebilir. "



3

Node.js'de gerçek çoklu okumaya ihtiyacım vardı ve benim için işe yarayan , thread paketiydi. Kendi Node.js mesaj döngüsüne sahip başka bir işlem oluşturur, böylece birbirlerini engellemezler. Kurulum kolaydır ve dokümantasyon hızlı bir şekilde çalışmaya başlamanızı sağlar. Ana programınız ve işçiler her iki şekilde de iletişim kurabilir ve gerekirse işçi "konuları" öldürülür.

Çoklu kullanım ve node.js olduğundan bir karmaşık ve yaygın olarak tartışılan konu, bir paket bulmak oldukça zordu bunun için çalışmalar benim özel gereksinimi. Kayıt için bunlar benim için işe yaramadı :

  • Tiny-worker çalışanların çoğalmasına izin verdi, ancak aynı mesaj döngüsünü paylaşıyor gibiydiler (ama yanlış bir şey yapmış olabilirim - iş parçacıkları bana güven veren daha fazla dokümantasyona sahipti ve gerçekten birden fazla işlem kullandığından, işe yarayana kadar devam ettim)
  • webworker-thread'lerirequire ihtiyaç duyduğum çalışanlarda -ing modüllerine izin vermedi

Ve neden gerçek çoklu iş parçacığına ihtiyacım olduğunu soranlar için: Raspberry Pi ve kesintileri içeren bir uygulama için. Bir iş parçacığı bu kesintileri ele alırken bir diğeri verileri (ve daha fazlasını) depolamakla ilgilenir.


1
Bu cevaba verilen harika düşünceyi takdir ediyorum!
MLissCetrus

3

Nodejs 10.5.0 sürümü, Node.js'de çoklu okuma yapılacağını duyurdu . Özellik hala deneyseldir. Şimdi kullanılabilir yeni bir worker_threads modülü var.

Node.js v10.5.0 veya üstünü çalıştırırsanız çalışan iş parçacıklarını kullanmaya başlayabilirsiniz , ancak bu deneysel bir API'dir . Varsayılan olarak kullanılamaz: Eğer kullanarak etkinleştirmek için gereken  --experimental-işçi Node.js. çağırma

İşte ES6 ve worker_threads etkinleştirilmiş, sürüm 12.3.1'de test edilmiş bir örnek

//package.json

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

Şimdi, Worker'ı worker_threads'den içe aktarmanız gerekir . Not: ES6 desteği için js dosyalarınızı '.mjs' uzantılı ilan etmeniz gerekir .

//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();

Son olarak bir workerService.mjs oluşturuyoruz

//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}`);

Çıktı:

npm çalıştırma başlangıcı

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

2
Bu sizin makaleniz mi : blog.logrocket.com/… ?
serv-inc

Hayır .. değil ... Yine de zamanında geri göndermiştim.
priyeshdkr



0

Şunları arıyor olabilirsiniz Promise.race(konu değil, yerel I / O yarış çözümü)

Sizin (veya bu soruyu arayan diğer kişilerin) başarısızlıktan kaçınmak ve G / Ç işlemlerinin maliyetinden kaçınmak için iş parçacıklarıyla yarışmak istediğinizi varsayarsak, bu, bunu başarmanın basit ve doğal bir yoludur (iş parçacıkları kullanmaz). Düğüm, tek iş parçacıklı olacak şekilde tasarlanmıştır (olay döngüsüne bakın), bu nedenle mümkünse evreleri kullanmaktan kaçının. Varsayımım doğruysa, Promise.raceile kullanmanızı tavsiye ederim setTimeout(bağlantıdaki örnek). Bu strateji ile, her biri bazı G / Ç işlemlerini deneyen ve bir hata varsa (aksi takdirde zaman aşımı) verilen sözü reddeden bir sözler listesiyle yarışırsınız. Promise.raceİfadesi istediğini gibi görünüyor ilk çözünürlük / reddi, sonra devam eder. Umarım bu birine yardımcı olur!


2
Bunun iş parçacıklarıyla ilgisi yok. Hepsi aynı başlıkta çalışıyor.
Evan Carroll

@EvanCarroll - Yeterince açık olmadığım konusunda beni uyardığın için teşekkür ederim. Birisinin neden iş parçacığı yarışına baktığına dair bir varsayımla önsöz verdim ve bunun Node'un olay döngüsündeki vaatleri kullandığını belirttim. Başka bir dilden geliyorsa, konuların ne yaptığını ancak olay döngüsüne veya vaatlere henüz aşina olmadığınız şeyleri başarmak istemeniz çok olasıdır. Hedefiniz buysa, bunu başarmanın daha basit yolları olduğunu belirtmek isterim. Bunun konuları kullanmadığına dair bir parantez ekledim. Bu işleri düzeltirse bana haber ver.
smileham

Aynı zamanda OP kriterlerine de cevap veriyor gibi görünüyor: "Diğer tüm iş parçacıkları arasında herhangi bir yöntem başarısız olursa öldürülmelidir", bu yüzden bunun alakalı olduğunu düşündüm.
smileham

Promise.race, eşzamansız bir işlem durumunda birinden diğerine geçerek (veya eşzamansız bir işlev olması durumunda bekler) tüm sözleri sırayla yürütür.
Nagabhushan Baddi

0

Node.js iş parçacığı kullanmaz. Mucidine göre bu önemli bir özellik. Buluş sırasında iplikler yavaş, sorunlu ve zordu. Node.js, verimli bir tek çekirdekli alternatifin araştırılması sonucunda oluşturuldu. Node.js meraklılarının çoğu, son 50 yılda iş parçacıkları iyileştirilmemiş gibi hala eski argümandan alıntı yapıyor.

Bildiğiniz gibi JavaScript'i çalıştırmak için Node.js kullanılıyor. JavaScript dili de yıllar içinde gelişmiştir. Artık birden çok çekirdek kullanmanın yolları var - yani İplikler ne yapıyor. Dolayısıyla, JavaScript'teki gelişmeler aracılığıyla uygulamalarınızda çok çekirdekli çok görevli bazı işlemler yapabilirsiniz. user158, Node.js'nin onunla biraz oynadığına işaret ediyor. Bunun hakkında hiçbir şey bilmiyorum. Ama neden Node.js'nin JavaScript'in sunduklarını onaylamasını bekleyesiniz?

Node.js çoklu iş parçacığı yerine JavaScript çoklu iş parçacığı için Google. Web Çalışanları, Sözler ve diğer şeyler hakkında bilgi edineceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.