Aynı anda birden çok yöntemi çalıştırmak için iş parçacığı oluşturmanın bir yolu var mı?
Bu şekilde, diğer tüm iş parçacıkları arasında herhangi bir yöntem başarısız olursa öldürülmelidir.
Aynı anda birden çok yöntemi çalıştırmak için iş parçacığı oluşturmanın bir yolu var mı?
Bu şekilde, diğer tüm iş parçacıkları arasında herhangi bir yöntem başarısız olursa öldürülmelidir.
Yanıtlar:
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
Node.js içinden yerel iş parçacığı oluşturmak için en az bir kitaplık da vardır: node-webworker-thread
https://github.com/audreyt/node-webworker-threads
Bu, temel olarak node.js için Web Çalışanı tarayıcı API'sini uygular.
Düğüm 10.5'ten artık çoklu iş parçacığı desteği var , ancak bu deneysel . Umarım bu yakında stabil hale gelir.
Aşağıdaki kaynakları kontrol edin:
Güncelleme :
Node v11.7.0'dan itibaren --experimental-worker
bayrak kullanmanız gerekmez .
Sürüm notu: https://nodejs.org/en/blog/release/v11.7.0/
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. "
Rx kullanıyorsanız, işi paralel yürütmeye bölmek için rxjs-cluster'a eklenti yapmak oldukça basittir. (sorumluluk reddi: Ben yazarım)
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ı :
require
ihtiyaç duyduğum çalışanlarda -ing modüllerine izin vermediVe 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.
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
Proje durumundan emin olmasam da artık https://github.com/xk/node-threads-a-gogo da var .
NodeJS artık iş parçacıkları içeriyor (yanıtlama sırasında deneysel bir özellik olarak).
Ş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.race
ile 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!
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.