Heim > Web-Frontend > js-Tutorial > So lernen Sie die Module „process' und „child_process' im Knoten (ausführliches Tutorial)

So lernen Sie die Module „process' und „child_process' im Knoten (ausführliches Tutorial)

亚连
Freigeben: 2018-06-01 10:41:12
Original
1851 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich die Studiennotizen zum Prozess- und Child_Process-Modul des Knotens vorgestellt. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz.

Nachdem ich eine Woche lang mit dem Prozess zu kämpfen hatte, habe ich endlich das obskure und schwierige Dokument verstanden und bin bereit, mein Verständnis mit allen zu teilen. Ich hoffe auch, dass jeder einige Meinungen äußern kann

Prozess Das Konzept von

  1. in Node.js besteht darin, dass jede Anwendung ein Instanzobjekt der Prozessklasse ist.

  2. Verwenden Sie das Prozessobjekt, um die Anwendung darzustellen. Dies ist ein globales Objekt, über das Sie die Attribute der Node.jsy-Anwendung sowie des Benutzers und der Umgebung abrufen können, die das Programm ausführen Ereignisse.

Mehrere wichtige Attribute im Prozess

  1. Stdin-Standardeingabe-lesbarer Stream

  2. stdout-Standardeingabe-beschreibbarer Stream

  3. stderr-Standardfehler-Ausgabestream

  4. argv-Terminal-Eingabeparameter-Array

  5. Env-Betriebssystemumgebungsinformationen

  6. PID-Anwendungsprozess-ID

stdin und stdout

process.stdin.on('data', (chunk) => {
 process.stdout.write('进程接收到数据' + chunk)
})
Nach dem Login kopieren

Ergebnisse ausführen

argv

console.log(process.env)
Nach dem Login kopieren

env: Geben Sie export NODE_ENV=develop

console.log(process.env.NODE_ENV) //develop
Nach dem Login kopieren
< im Mac-Terminal ein 🎜>

Prozessmethoden

  1. process.memoryUsage() Informationen zur Speichernutzung anzeigen

  2. process.nextTick() Aktuell Nach der Ereignisschleife ist ausgeführt, wird die Rückruffunktion ausgeführt

  3. process.chdir() Die chdir-Methode wird verwendet, um das aktuelle Arbeitsverzeichnis zu ändern, das in der Node.js-Anwendung verwendet wird

  4. process.cwd() Das aktuelle Arbeitsverzeichnis des Prozesses

  5. process.kill() Töte den Prozess

  6. Prozess. uncaughtException() Wenn die Anwendung das uncaughtException-Ereignis des Prozessobjekts auslöst, wird eine nicht abgefangene Ausnahme ausgelöst

  7. say() //方法不存在
    process.on(&#39;uncaughtException&#39;,function(err){
     console.log(&#39;捕获到一个未被处理的错误:&#39;,err);
    });
    Nach dem Login kopieren

child_process

Der untergeordnete Prozess ist der Schwerpunkt von heute, ich habe auch einige Dinge, die ich nicht ganz verstehe, und ich hoffe, ich kann mehr mit Ihnen kommunizieren

Der Hintergrund von child_process

In Node.js gibt es nur einen Thread, der alle Vorgänge ausführt. Wenn ein Vorgang eine große Menge an CPU-Ressourcen erfordert, müssen nachfolgende Vorgänge warten.

In Node.js wird ein child_process-Modul bereitgestellt, über das mehrere untergeordnete Prozesse gestartet werden können, der Speicherplatz zwischen mehreren untergeordneten Prozessen gemeinsam genutzt werden kann und der Informationsaustausch durch gegenseitige Kommunikation der untergeordneten Prozesse erreicht werden kann.

Das Modul „child_process“ gibt Node die Möglichkeit, nach Belieben untergeordnete Prozesse zu erstellen. Das offizielle Dokument von „node“ gibt vier Methoden für das Modul „child_proces“ an, mit denen tatsächlich untergeordnete Prozesse erstellt werden. Für Entwickler sind die APIs dieser Methoden jedoch etwas anders.

child_process.exec(command[, options][, callback]) startet den

untergeordneten Prozess, um den Shell-Befehl auszuführen, was möglich ist über den Callback-Parameter das Ergebnis der Skript-Shell-Ausführung abrufen

child_process.execfile(file[, args][, options][, callback])

Anders als der exec-Typ führt er keinen Shell-Befehl aus aber eine ausführbare Datei

child_process.spawn(command[, args][, options]) führt nur einen Shell-Befehl aus und muss das Ausführungsergebnis nicht abrufen

child_process.fork(modulePath[ , args][, Optionen ]) Sie können den Knoten

verwenden, um die .js-Datei auszuführen, und es ist nicht erforderlich, das Ausführungsergebnis abzurufen. Der untergeordnete Prozess, der aus der Verzweigung kommt, muss der Knotenprozess

spawn

sein. Syntax: child_process.spawn(command, [args], [options])

  1. Befehlsparameter, die angegeben werden müssen, geben den auszuführenden Befehl an

  2. args-Array, das alle zum Ausführen des Befehls erforderlichen Parameter speichert

  3. Der
  4. options-Parameter ist ein Objekt, mit dem die Optionen angegeben werden, die beim Starten eines untergeordneten Prozesses verwendet werden

  5. const { spawn } = require(&#39;child_process&#39;)
    const path = require(&#39;path&#39;)
    
    let child1 = spawn(&#39;node&#39;, [&#39;test1.js&#39;, &#39;yanyongchao&#39;], {
     stdio: [&#39;pipe&#39;, &#39;pipe&#39;, &#39;pipe&#39;], // 三个元素数组 下面会详解
     cwd: __dirname, 子进程工作目录
     env: process.env, 环境变量
     detached: true // 如果为true,当父进程不存在时也可以独立存在
    })
    Nach dem Login kopieren
Tatsächlich ist das oben Genannte leicht zu verstehen, außer für das sdtio-Array. Lassen Sie uns stdio

stdio

stdio ist ein Array, das zum Festlegen von Standardeingabe, Standardausgabe und Fehlerausgabe verwendet wird. Persönliches Verständnis

Pipe: Stellen Sie eine Pipe zwischen dem übergeordneten Prozess und dem untergeordneten Prozess her

Hauptprozesscode

const path = require(&#39;path&#39;)
const { spawn } = require(&#39;child_process&#39;)

let p = spawn(&#39;node&#39;, [&#39;childs_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [&#39;pipe&#39;, &#39;pipe&#39;, process.stderr]
})

p.stdout.on(&#39;data&#39;, (data) => {
 console.log(data.toString())
}) 
// 这里用stdout原因: 子进程的数据流与常规理解的数据流方向相反,
// stdin:写入流,stdout、stderr:读取流。
Nach dem Login kopieren

Untergeordneter Prozesscode

process.stdout.write(&#39;asd&#39;)
Nach dem Login kopieren

Wenn Sie sagen it in stdio A stream,process.stdout,process.stdin

Hauptprozesscode

const { spawn } = require(&#39;child_process&#39;)
const path = require(&#39;path&#39;)

// 如果放的是一个流,则意味着父进程和子进程共享一个流
const p = spawn(&#39;node&#39;, [&#39;child_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [process.stdin, process.stdout, process.stderr]
})
Nach dem Login kopieren

untergeordneter Prozesscode

process.stdout.write(&#39;asd&#39;) //控制台会输出asd
Nach dem Login kopieren

ipc

Hauptprozesscode

const path = require(&#39;path&#39;)
const { spawn } = require(&#39;child_process&#39;)

let p = spawn(&#39;node&#39;, [&#39;child_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [&#39;ipc&#39;, &#39;pipe&#39;, &#39;pipe&#39;]
})

p.on(&#39;message&#39;, (msg) => {
 console.log(msg)
})

p.send(&#39;hello chhild_process&#39;)
Nach dem Login kopieren

Untergeordneter Prozesscode

process.on(&#39;message&#39;, (msg) => {
 process.send(&#39;子进程&#39; + msg)
})
// child.send(message,[sendHandle]);//在父进程中向子进程发送消息
// process.send(message,[sendHandle]);//在子进程中向主进程发送消息
Nach dem Login kopieren

getrennter Modus

const { spawn } = require(&#39;child_process&#39;)
const fs = require(&#39;fs&#39;)
const path = require(&#39;path&#39;)
let out = fs.openSync(path.join(__dirname, &#39;childs/msg.txt&#39;), &#39;w&#39;, 0o666)

let p = spawn(&#39;node&#39;, [&#39;test4.js&#39;], {
 detached: true, //保证父进程结束,子进程仍然可以运行
 stdio: &#39;ignore&#39;,
 cwd: path.join(__dirname, &#39;childs&#39;)
})

p.unref()

p.on(&#39;close&#39;, function() {
 console.log(&#39;子进程关闭&#39;)
})

p.on(&#39;exit&#39;, function() {
 console.log(&#39;子进程退出&#39;)
})

p.on(&#39;error&#39;, function(err) {
 console.log(&#39;子进程1开启失败&#39; + err)
})
Nach dem Login kopieren

Fork startet einen untergeordneten Prozess

  1. Erzeugen Sie einen neuen Node.js-Prozess und rufen Sie ein bestimmtes Modul auf, indem Sie einen IPC-Kommunikationskanal einrichten, der es dem übergeordneten Prozess und dem untergeordneten Prozess ermöglicht, Informationen aneinander zu senden

  2. Die Fork-Methode gibt ein implizit erstelltes ChildProcess-Objekt zurück, das den untergeordneten Prozess darstellt

  3. Nachdem der Eingabe-/Ausgabevorgang des untergeordneten Prozesses abgeschlossen ist, wird der untergeordnete Prozess nicht automatisch beendet und muss explizit mit der Methode „process.exit()“ beendet werden untergeordneter Prozess

    const { fork } = require(&#39;child_process&#39;)
    const path = require(&#39;path&#39;)
    let child = fork(path.join(__dirname, &#39;childs/fork1.js&#39;))
    
    child.on(&#39;message&#39;, (data) => {
     console.log(&#39;父进程接收到消息&#39; + data)
    })
    
    child.send(&#39;hello fork&#39;)
    
    child.on(&#39;error&#39;, (err) => {
     console.error(err)
    })
    Nach dem Login kopieren
execFile öffnet den untergeordneten Prozess

let { execFile } = require(&#39;child_process&#39;)
let path = require(&#39;path&#39;)

let p1 = execFile(&#39;node&#39;, [&#39;exec.js&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;)
}, function(err, stdout, stderr) {
 console.log(stdout)
})
Nach dem Login kopieren

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

根据vue里面设置全局变量或者数据方法(详细教程)

利用jquery点击回车键实现登录效果(详细教程)

如何在vue2中设置全局变量?(详细教程)

Das obige ist der detaillierte Inhalt vonSo lernen Sie die Module „process' und „child_process' im Knoten (ausführliches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage