Node.js single-thread modda çalışır, ancak eşzamanlılığı idare etmek için olay odaklı bir paradigma kullanır. Ayrıca, çok çekirdekli CPU tabanlı sistemlerde paralel işleme uygulamak için alt (child) işlemlerin (process) oluşturulmasını kolaylaştırır.
Alt işlemler her zaman ana işlemin stream’leri ile paylaşılabilen üç stream olan child.stdin, child.stdout ve child.stderr’a sahiptir. Node.js, bir alt işlem oluşturmak için aşağıdaki üç ana yönteme sahip olan child_process modülünü sağlar.
- exec – child_process.exec yöntemi, bir kabuk / konsoldaki bir komutu çalıştırır ve çıktıyı arabelleğe alır.
- spawn – child_process.spawn belirli bir komutla yeni bir işlem başlatır.
- fork – child_process.fork yöntemi, alt işlemleri oluşturmak için spawn () özel bir durumdur.
exec Metodu
child_process.exec yöntemi bir Console/Terminalde bir komut çalıştırır ve çıktıyı arabelleğe alır.
1 |
child_process.exec(command[, options], callback) |
Parametreler:
- command (String): Boşluk Çalıştırılacak komut, (boşluk karakteri ile ayrılmış argümanlar şeklinde yazılır)
- options (Object): aşağıdaki seçeneklerden bir veya daha fazlasını içerebilir.
- cwd (String): Alt işlemin çalıştığı geçerli dizin
- env (Object): Anahtar-değer çiftleri
- encoding (String): (Geçerli değer: ‘utf8’)
- shell (String): Komutların çalıştırılacağı kabuk. (UNIX, WINDOWS, IOS ortamlarında farklı kabuklar vardır. Örneğin Windows’ta cmd.exe gibi)
- timeout (Number): (Geçerli değer: 0)
- maxBuffer (Number) (Geçerli değer: 200*1024)
- killSignal (String) (Geçerli Değer: ‘SIGTERM’)
- uid (Number): İşlemin kullanıcı kimliğini ayarlar
- gid (Number): İşlemin grup kimliğini ayarlar.
- callback: Bu fonksiyon error, stdout, and stderr adında üç argüman alır. Bu argümanlar process sona erdiğinde çıktı için kullanılır.
Bu örnek için destek.js ve ana.js olmak üzere iki dosya kullanılacaktır. Öncelikle destek.js:
1 |
console.log("Alt Islem " + process.argv[2] + " calisti." ); |
argv[2] nasıl aldığına dikkat. Bu bilgi diğer taraftan boşluk kullanılarak gönderilecektir. Örneğin “node destek.js 3” gibi bir veride argv[2] 3 değerini döndürür. (Öğrencilerim C ve C# anlatırken argümanların nereden geldiğini hatırlamışlardır. – C main argument şeklinde bir googling yapabilirsiniz.) Gelelim ana.js dosyasına:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<4; i++) { var workerProcess = child_process.exec('node destek.js '+i,function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Hata Kodu: '+error.code); console.log('Sinyal alindi: '+error.signal); } console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); }); workerProcess.on('exit', function (code) { console.log('Alt islem exit kodu ile cikti '+code); }); } |
“child_process.exec(‘node support.js ‘+i” kodu ile bir alt işlem çalıştırılır. Yukarıdaki örnekte alt işlem 4 defa çağrılmıştır ve argüman olarak döngünün i değeri gönderilmiştir. Çıktısı:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Alt islem exit kodu ile cikti 0 stdout: Alt islem 1 calisti. stderr: Alt islem exit kodu ile cikti 0 stdout: Alt islem 0 calisti. stderr: Alt islem exit kodu ile cikti 0 stdout: Alt islem 2 calisti. stderr: Alt islem exit kodu ile cikti 0 stdout: Alt islem 3 calisti. |
spawn() Metodu
spawn() metodu belirli bir komutla yeni bir işlem başlatmak için kullanılır.
1 |
child_process.spawn(command[, args][, options]) |
Parametreler:
- command (String): Çalıştırılacak komut
- args (Array): Argümanların listesi – string türünden
- options (Object) aşağıdaki seçeneklerden bir veya daha fazlasını içerebilir.
- cwd (String): Alt işlemin geçerli çalışma dizini.
- env (Object): Anahtar-değer çifti.
- stdio (Array): Altın stdio ayarları – string türünden.
- customFds (Array): Stdio için kullanılacak child (alt) için kaldırılmış dosya tanımlayıcıları.
- detached (Boolean): İşlem grup lideri olan alt.
- uid (Number): İşlemin kullanıcı kimliğini ayarlar
- gid (Number): İşlemin grup kimliğini ayarlar.
Spawn () metodu stream döndürür (stdout & stderr) ve işlem belirli bir miktar veri döndürdüğünde kullanılmalıdır. spawn (), işlem yürütülmeye başlar başlamaz yanıtı almaya başlar. Bir önceki örnekte olduğu gibi iki dosyamız olsun. destek.js yukarıdaki gibi ve ana.js aşağıdaki gibi tekrar düzenliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const fs = require('fs'); const child_process = require('child_process'); for(var i = 0; i<3; i++) { var workerProcess = child_process.spawn('node', ['destek.js', i]); workerProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); workerProcess.on('close', function (code) { console.log('Alt islem exit kodu ile cikti ' + code); }); } |
Ekran çıktısı:
1 2 3 4 5 6 7 8 9 |
stdout: Alt islem 0 calisti. Alt islem exit kodu ile cikti 0 stdout: Alt islem 1 calisti. stdout: Alt islem 2 calisti. Alt islem exit kodu ile cikti 0 Alt islem exit kodu ile cikti 0 |
fork() Metodu
Node işlemleri yaratmak için spawn metodunun özel bir durumu olan metottur.
1 |
<strong>child_process.fork(modulePath[, args][, options])</strong> |
Parametreler:
- modulePath (String) Altta çalışacak modül.
- args (Array) String türünden argüman listesi
- options (Object) aşağıdaki seçeneklerden bir veya daha fazlasını içerebilir.
- cwd (String): Alt işlemin geçerli çalışma dizini.
- env (Object): Anahtar-değer çifti.
- execPath (String): Çalıştırılabilir alt işlemleri yaratmak için kullanılır.
- execArgv (Array): Çalışır string türünden argüman listesini aktarma (Geçerli değer: process.execArgv)
- silent (Boolean): Eğer true ise stdin, stdout, and stderr altları ebevenye yönlendirilir, aksi takdirde ebeveynden kalıtılacaktır. Daha fazla bilgi için spawn()’ın stdio’sunun “pipe” ve “inherit” seçeneklerini bakınız. (Geçerli değeri: false)
- uid (Number): İşlemin kullanıcı kimliğini ayarlar
- gid (Number): İşlemin grup kimliğini ayarlar.
Fork metodu, bir ChildProcess örneğinde tüm yöntemlere sahip olmanın yanı sıra yerleşik bir iletişim kanalına sahip bir nesneyi döndürür.
Örneğimizde yine yukarıdaki “destek.js” dosyasını kullanacağız. Ana.js dosyamız aşağıdaki gibi düzenlenmiştir.
1 2 3 4 5 6 7 8 9 10 |
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("detek.js", [i]); worker_process.on('close', function (code) { console.log('Alt islem exit kodu ile cikti ' + code); }); } |
Bu programın çıktısı:
1 2 3 4 5 6 |
Alt islem 1 calisti. Alt islem w calisti. Alt islem e calisti. Alt islem exit kodu ile cikti 0 Alt islem exit kodu ile cikti 0 Alt islem exit kodu ile cikti 0 |