Datenlieferanten von Drittanbietern kapseln Daten und Python zusammen, und Datenabfragen können nur durch Aufrufen von Python-Methoden implementiert werden. Wenn Python-Methodenaufrufe durch einfache Node-Kapselung implementiert werden können, ist eine schnelle Einführung möglich und Entwicklungskosten können gespart werden. Die einfachste und gröbste Kommunikationsmethode besteht darin, dass Nodejs ein Python-Skript aufruft und dann die Ausgabe des untergeordneten Prozesses erhält. Da der Vorgang des Startens von Python und des Ladens von Datenpaketen jedoch jedes Mal relativ lang ist, wird dieser Prozess optimiert. Prozesskommunikation index.py # Gekapseltes Python-Paket, riesige Größe from mb import MB # Abfrage aus dem Datenpaket mbe.get('1.0.1.0') index.js const { spawn } = erfordern('Kindprozess'); const ls = spawn('python3', ['index.py']); ls.stdout.on('Daten', (Daten) => { Konsole.log(`stdout: ${data}`); }); ls.stderr.on('Daten', (Daten) => { Konsole.Fehler(`stderr: ${data}`); }); ls.on('schließen', (Code) => { console.log(`Unterprozess wurde mit dem Code $[code] beendet`); }); Verwenden Sie child_process.spawn, um einen Python-Unterprozess zu erzeugen und die Standardausgabe abzuhören. Die obige Methode ist auch ein Beispiel in der offiziellen Dokumentation. Derzeit gibt es mit diesem Beispiel zwei Probleme:
Bidirektionale Kommunikation zwischen Prozessen Die Voraussetzung dafür, dass Daten einmal geladen und mehrfach verwendet werden können, ist, dass der Python-Prozess nach dem Start nicht beendet werden kann. Der Grund, warum der Python-Prozess beendet wird, ist, dass nichts zu tun ist. Daher umfassen gängige Methoden Schleifen, Ruhezustand und Abhören von Ports. Diese Methoden können in synchrone blockierende Aufgaben und synchrone nicht blockierende Aufgaben übersetzt werden. Die kostengünstigsten davon sind synchrone nicht blockierende Aufgaben. Dann können Sie an Select und Epoll von Linux denken. Ich habe eine einfache Suche nach Pythons Epoll durchgeführt und es scheint, dass es ein natives Paket gibt. index.py - hört auf stdin über epoll System importieren fcntl importieren Importieren Sie die Auswahl von MB MB importieren JSON importieren mbe = MB('./Daten') # Epoll-Modell fd = sys.stdin.fileno() epoll = wählen Sie.epoll() epoll.register(fd, wähle.EPOLLIN) versuchen: während True: events = epoll.poll(10) # Synchrone nicht blockierende Daten = '' für Dateinummer, Ereignis in Ereignissen: data += sys.stdin.readline() # Daten über die Standardeingabe abrufen, wenn data == '' oder data == '\n': weitermachen items = xxx # Nummernverarbeitung für Artikel in Artikeln: Ergebnis = mbe.get(Artikel) sys.stdout.write(json.dumps(result, ensure_ascii=False) +'\n') # In Standardausgabe schreibensys.stdout.flush() # Pufferaktualisierungschließlich: epoll.unregister(fd) epoll.schließen() index.js - Daten über stdin senden const untergeordneter Prozess = erforderlich('untergeordneter Prozess'); const child = child_process.spawn('python3', ['./base.py']); lass Rückrufe = [], chunks=Puffer.alloc(0), chunkArr = [], Daten = '', onwork = false; // Puffer kann nicht dynamisch erweitert werden child.stdout.on('data', (chunk) => { chunkArr.push(brocken) wenn (onwork) zurückgeben; bei der Arbeit = wahr; während(chunkArr.length) { chunks = Puffer.concat([chunks, chunkArr.pop()]); const Länge = Chunks.Länge; sei trunkAt = -1; für(const [k, d] von chunks.entries()) { if (d == '0x0a') { // 0a endet data += chunks.slice(trunkAt+1, trunkAt=k); const cb = Rückrufe.Shift(); cb(null, Daten === 'null' ? null : Daten ) Daten = ''; } } wenn (trunkAt < Länge) { Stücke = Stücke.Scheibe(trunkAt+1) } } bei der Arbeit = falsch; }) setzeIntervall(() => { if (callbacks.length) child.stdin.write(`\n`); // Auf der Nodejs-Seite gibt es keine Flush-Methode für Standard-Ein- und -Ausgabe, daher kann man nur einen Hack verwenden. Python kann die neuesten Daten nach dem Schreiben nicht rechtzeitig abrufen.}, 500) exports.getMsg = Funktion getMsg(ip, cb) { Rückrufe.push(cb) child.stdin.write(`${ip}\n`); // Daten in die Standardeingabe des Kindprozesses schreiben} Python und Nodejs kommunizieren über stdio; Python hört über epoll auf stdin, um Speicherresidenz und Langzeitbetrieb zu erreichen. Probleme
Zusammenfassen Obwohl eine bidirektionale Kommunikation zwischen Nodejs und Python möglich ist, wird diese Methode aufgrund der oben genannten Probleme hier nicht empfohlen. HTTP oder Socket sind viel besser. Dies ist das Ende dieses Artikels über den Implementierungscode der bidirektionalen Kommunikation zwischen Nodejs und Python. Weitere relevante Inhalte zur bidirektionalen Kommunikation zwischen Nodejs und Python finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: So verwenden Sie Docker zum Erstellen eines Tomcat-Clusters mit Nginx (mit Bildern und Text)
>>: MySQL-Transaktions-Tutorial Yii2.0 Händler-Auszahlungsfunktion
In diesem Artikel wird hauptsächlich erläutert, w...
Von: https://blog.csdn.net/qq_44761243/article/de...
<br />Wenn die Seite <img src=""...
1. Zusammengesetzter Primärschlüssel Der sogenann...
Normalerweise gibt es bei der Entwicklung von Lin...
Inhaltsverzeichnis einführen Unterstützt Intel-CP...
Unter Graustufenfreigabe versteht man eine Freiga...
Beim Entwurf von Tabellenstrukturen gehören numer...
In diesem Artikel finden Sie den spezifischen Cod...
React ist eine JavaScript-Bibliothek zum Erstelle...
Es gibt zwei Hauptgründe, warum es schwierig ist,...
Vor einiger Zeit habe ich einen Blogbeitrag mit d...
Wenn MySQL zu viel CPU beansprucht, wo sollten wi...
Vorwort Als ich kürzlich an einem Projekt arbeite...
Zuvor haben wir Docker verwendet, um das SpringBo...