Node.js passt perfekt zu unserem Webprojekt, aber es gibt nur wenige Rechenaufgaben, für die wir Python bevorzugen würden. Wir haben auch bereits einen Python-Code für sie. Wir sind sehr besorgt über die Geschwindigkeit. Was ist die eleganteste Art, einen Python-Worker von node.js asynchron und nicht blockierend aufzurufen?
127
Antworten:
Für die Kommunikation zwischen node.js und Python-Server würde ich Unix-Sockets verwenden, wenn beide Prozesse auf demselben Server ausgeführt werden, andernfalls TCP / IP-Sockets. Für das Marshalling-Protokoll würde ich JSON oder Protokollpuffer verwenden . Wenn sich Thread-Python als Engpass herausstellt , sollten Sie Twisted Python verwenden , das dieselbe ereignisgesteuerte Parallelität bietet wie node.js.
Wenn Sie sich abenteuerlustig fühlen, lernen Sie Clojure ( Clojurescript , Clojure-py ) und Sie erhalten dieselbe Sprache, die mit vorhandenem Code auf Java, JavaScript (einschließlich node.js), CLR und Python ausgeführt wird und zusammenarbeitet. Und Sie erhalten ein hervorragendes Marshalling-Protokoll, indem Sie einfach Clojure-Datenstrukturen verwenden.
quelle
Dies klingt nach einem Szenario, in dem zeroMQ gut passt. Es ist ein Messaging-Framework, das der Verwendung von TCP- oder Unix-Sockets ähnelt, aber viel robuster ist ( http://zguide.zeromq.org/py:all ).
Es gibt eine Bibliothek, die zeroMQ verwendet, um ein RPC-Framework bereitzustellen, das ziemlich gut funktioniert. Es heißt zeroRPC ( http://www.zerorpc.io/ ). Hier ist die Hallo Welt.
Python "Hallo x" Server:
Und der node.js-Client:
Oder umgekehrt, node.js Server:
Und der Python-Client
quelle
Wenn Sie festlegen, dass Ihr Python-Worker in einem separaten Prozess (entweder einem lang laufenden Server-Prozess oder einem bei Bedarf erstellten Kind) ausgeführt wird, erfolgt Ihre Kommunikation mit ihm auf der Seite node.js asynchron. UNIX / TCP-Sockets und stdin / out / err-Kommunikation sind im Knoten von Natur aus asynchron.
quelle
Ich würde auch Apache Thrift in Betracht ziehen http://thrift.apache.org/
Es kann mehrere Programmiersprachen überbrücken, ist hocheffizient und unterstützt asynchrone oder synchronisierte Aufrufe. Die vollständigen Funktionen finden Sie hier http://thrift.apache.org/docs/features/
Die Mehrsprachigkeit kann für zukünftige Pläne nützlich sein. Wenn Sie beispielsweise später einen Teil der Rechenaufgabe in C ++ ausführen möchten, können Sie sie ganz einfach mit Thrift zum Mix hinzufügen.
quelle
Ich habe viel Erfolg mit thoonk.js zusammen mit thoonk.py gehabt . Thoonk nutzt Redis (speicherinterner Schlüsselwertspeicher), um Ihnen Feed- (Think Publish / Subscribe), Warteschlangen- und Jobmuster für die Kommunikation bereitzustellen.
Warum ist das besser als Unix-Sockets oder direkte TCP-Sockets? Die Gesamtleistung kann etwas abnehmen, Thoonk bietet jedoch eine wirklich einfache API, die es einfacher macht, manuell mit einem Socket umzugehen. Thoonk macht es auch sehr einfach, ein verteiltes Computermodell zu implementieren, mit dem Sie Ihre Python-Worker skalieren können, um die Leistung zu steigern, da Sie einfach neue Instanzen Ihrer Python-Worker hochfahren und sie mit demselben Redis-Server verbinden.
quelle
Ich würde empfehlen, eine Arbeitswarteschlange zu verwenden, indem Sie beispielsweise den hervorragenden Gearman verwenden , mit dem Sie Hintergrundjobs auf hervorragende Weise versenden und deren Ergebnis nach der Verarbeitung asynchron abrufen können.
Der Vorteil, der bei Digg (unter anderem) häufig verwendet wird, besteht darin, dass es eine starke, skalierbare und robuste Möglichkeit bietet, Mitarbeiter in jeder Sprache dazu zu bringen, mit Kunden in jeder Sprache zu sprechen.
quelle
Update 2019
Es gibt verschiedene Möglichkeiten, dies zu erreichen, und hier ist die Liste in aufsteigender Reihenfolge der Komplexität
Ansatz 1 Python Shell Einfachster Ansatz
Datei source.js
Datei destination.py
Hinweise : Erstellen Sie einen Ordner mit dem Namen "Abonnent", der sich auf derselben Ebene wie die Datei "source.js" befindet, und legen Sie "destination.py" darin ab. Vergessen Sie nicht, Ihre virtuelle Umgebung zu ändern
quelle