Implementierungscode für die bidirektionale Kommunikation zwischen Node und Python

Implementierungscode für die bidirektionale Kommunikation zwischen Node und Python

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:

  • Nodejs sendet keine Daten an Python
  • Nachdem der Nodejs-Aufruf abgeschlossen ist, wird der Python-Unterprozess beendet. Die nächste Abfrage muss den Python-Befehl erneut aufrufen, um die Datei zu laden und die Daten abzufragen. Es ist nicht möglich, den Speicher einmal zu laden und ihn mehrmals zu verwenden.

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

  • Nodejs verwendet die Standardausgabe als Ausführungsergebnis, sodass die Python-Seite das Ausführungsergebnis nur ohne zusätzliche Druckinformationen in die Standardausgabe schreiben kann.
  • Die Standardeingabe auf der Nodejs-Seite verfügt nicht über eine Flush-Methode, sodass das Auslösen des Ereignisses auf der Python-Seite nicht rechtzeitig genug erfolgt. Derzeit wird ein Hack implementiert, indem auf der Nodejs-Seite regelmäßig leere Informationen gesendet werden.
  • Der Puffer kann nicht dynamisch erweitert werden, ist nicht so nützlich wie Zeiger in der Sprache C und ist beim Parsen von stdout hässlich.

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:
  • Python- und Node.js-Beispiele zum Generieren des aktuellen Zeitstempels
  • Was soll ich zwischen Node.js und Python wählen?
  • Ein einfacher statischer HTTP-Dateiserver, geschrieben in nodejs und Python
  • Vergleich der Zeichenverarbeitungsleistung zwischen Node.js, PHP und Python

<<:  So verwenden Sie Docker zum Erstellen eines Tomcat-Clusters mit Nginx (mit Bildern und Text)

>>:  MySQL-Transaktions-Tutorial Yii2.0 Händler-Auszahlungsfunktion

Artikel empfehlen

JavaScript-Tipps zur Verbesserung Ihrer Programmierkenntnisse

Inhaltsverzeichnis 1. Filtern Sie eindeutige Wert...

Lösungen für Probleme bei der Leistungsoptimierung von MySQL-Indizes

Die von MySQL erstellte Optimierung besteht im Hi...

Linux verwendet den Binärmodus zur Installation von MySQL

In diesem Artikel werden die einzelnen Schritte z...

Beispiel für das Hinzufügen von Attributen mithilfe von Stilen in HTML

Fügen Sie den erforderlichen Links Inline-Stile hi...

Erfahren Sie mehr über den Hyperlink A-Tag

fragen: Ich habe den Hyperlink mit CSS formatiert...

HTML-Meta erklärt

Einführung Der Meta-Tag ist ein Hilfstag im HEAD-...

Was sind die Kernmodule von node.js

Inhaltsverzeichnis Globales Objekt Globale Objekt...

Detaillierte Erläuterung der Implementierung der Nginx-Prozesssperre

Inhaltsverzeichnis 1. Die Rolle der Nginx-Prozess...

js zur Realisierung der automatischen Sperrbildschirmfunktion

1. Anwendungsszenarien Es gibt eine solche Anford...

Tutorial zur manuellen Installation und Konfiguration von mysql8.0.11 winx64

Lassen Sie mich zunächst über meinen Alltag sprec...

InnoDB-Typ MySql stellt Tabellenstruktur und Daten wieder her

Voraussetzung: Speichern Sie die .frm- und .ibd-D...

Css3 realisiert nahtloses Scrollen und Anti-Shake

Frage Das nahtlose Scrollen von Bildern und Texte...