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

Sechs wichtige Selektoren in CSS (merken Sie sie sich in drei Sekunden)

Von: https://blog.csdn.net/qq_44761243/article/de...

So verwenden Sie vs2019 für die Linux-Remote-Entwicklung

Normalerweise gibt es bei der Entwicklung von Lin...

So installieren Sie Postgres 12 + pgadmin im lokalen Docker (unterstützt Apple M1)

Inhaltsverzeichnis einführen Unterstützt Intel-CP...

Verwenden von Nginx zum Implementieren der Graustufenversion

Unter Graustufenfreigabe versteht man eine Freiga...

Die Tücken der automatischen Inkrementierung numerischer MySQL-Typen

Beim Entwurf von Tabellenstrukturen gehören numer...

Schreiben eines Schere-Stein-Papier-Spiels in JavaScript

In diesem Artikel finden Sie den spezifischen Cod...

So legen Sie schnell den Dateipfad-Alias ​​in React fest

React ist eine JavaScript-Bibliothek zum Erstelle...

Reiner CSS-Header, korrigierter Implementierungscode

Es gibt zwei Hauptgründe, warum es schwierig ist,...

So finden Sie Informationen zu nicht festgeschriebenen Transaktionen in MySQL

Vor einiger Zeit habe ich einen Blogbeitrag mit d...

Optimierungsmethoden, wenn MySQL zu viel CPU beansprucht (unbedingt lesen)

Wenn MySQL zu viel CPU beansprucht, wo sollten wi...

Lösung für Front-End-Browser-Schriftgrößen von weniger als 12 Pixel

Vorwort Als ich kürzlich an einem Projekt arbeite...