Einfaches RPC zwischen Python und C++
Gibt es ein bestehendes RPC Modul für Python, das folgende Bedingungen erfüllt: - Die RPC-Funktionen können von einem C/C++ Programm aus über Sockets aufgerufen werden - Es ist ein "Leichtgewicht" sein und kein 500-Pfund-Monster (aka XML-RPC-SOAP-Gelump usw.). Insb. will ich kein BOOST oder anderes Templateungeheuer. Oh, und GPL ist nicht (das Modul darf aber dafür im Gegenzug ein paar Mark kosten). Im Prinzip würde ich mit einer binärkompatiblen pickle-Klasse für C++ schon zufrieden sein. _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Gerson Kurz wrote:
Gibt es ein bestehendes RPC Modul für Python, das folgende Bedingungen erfüllt:
- Die RPC-Funktionen können von einem C/C++ Programm aus über Sockets aufgerufen werden
- Es ist ein "Leichtgewicht" sein und kein 500-Pfund-Monster (aka XML-RPC-SOAP-Gelump usw.).
Mir scheint, ich hoere da ein paar Vorurteile heraus... ;) XMLRPC ist absolut leichtgewichtig, und erfuellt auch deine anderen Voraussetzungen spielend. Die ueblichen Argumente gegen den mit XML grundsaetzlich verbundenen Overhead (Parsing und Aufblaehung der Daten etc.) ist fuer die meisten praktischen Anwendungsfaelle weitgehend irrelevant. Das heisst natuerlich nicht, dass sie fuer deinen speziellen Fall nicht trotzdem relevant sein koennten, aber es duerfte sich trotzdem lohnen, es einfach mal auszuprobieren. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Georg Mischler schrub:
Mir scheint, ich hoere da ein paar Vorurteile heraus... ;)
Ich habe keine Vorurteile, sondern ausgepraegte und vielleicht veraltete aber zumindest dereinst begruendet gewesene Feindbilder ohne Verfallsdatum, und, beispielsweise, C++ Templates gehoeren ganz oben mit dazu. Gleich neben Garbage Collection, Exception Handling und OS/2, du weisst. Gruende, warum ich XML-RPC nicht mag kann man beispielsweise hier http://www.counterpane.com/crypto-gram-0006.html nachlesen, siehe den Abschnitt ueber SOAP. (Was, fuer mich als technischen Laien, nix anderes ist wie eine reduplizierung der XML-RPC-Geschichte mit einem noch irrsinnigeren API. "Simple", ha ha ha )
XMLRPC ist absolut leichtgewichtig, und erfuellt auch deine anderen Voraussetzungen spielend.
Naja, "absolut leichtgewichtig": HelloClient.exe belegt 3 Megabyte RAM (Working Set Size auf Windows, wenn ich richtig gemessen habe). Im Readme.html liest man: "(XMLRPC is) Fast: All IO is non-blocking, so a slow client or network will not slow down the server." Aha. Hier der einleitende Satz aus http://www.unixguide.net/network/socketfaq/2.9.shtml: "Using non-blocking I/O means that you have to poll sockets to see if there is data to be read from them. Polling should usually be avoided since it uses more CPU time than other techniques." Aber, sie benutzen natürlich letztlich select() (siehe XmlRpcClient::execute()). Ist heute ein Programm schon "schnell", wenn es select() kennt, oder was? Dazu auch ein Quote aus dem XML-RPC-HOWTO: "It's also faster than you might expectaccording to measurements by Rick Blair, a round-trip XML-RPC call takes 3 milliseconds using Hannes Wallnöfer's Java implementation." Das sind die Statistiken, die ich liebe. Keine Angaben zur Maschine, oder zum Netzwerk; keine Angaben zum Aufruf (Komplexität: void Ping(void) oder übergabe einer tief verschachtelten Struktur?), keine Vergleichswerte, aber hey: 3 Millisekunden klingen erstmal spitze! Meinem Ruf (TM) gerecht werde ich natuerlich nur mit XML-Bashing: http://xmlsucks.org/but_you_have_to_use_it_anyway/does-xml-suck.pdf Abgesehen davon, dass man STL Patches braucht, die ich bisher nicht gebraucht habe, aus dem einfachen Grund, dass STL ein Sammelsurium extrem schlimmer Templates sind, und zu Templates siehe den einleitenden Absatz.
Die ueblichen Argumente gegen den mit XML grundsaetzlich verbundenen Overhead (Parsing und Aufblaehung der Daten etc.) ist fuer die meisten praktischen Anwendungsfaelle weitgehend irrelevant.
Siehe oben. Es handelt sich um eine "Kaestchen" (Embedded PC) Loesung, die Zeug bereitstellen kann. Mit 8, *vielleicht* 16 mb RAM. Schon der Einsatz von Python ist zum jetzigen Zeitpunkt ungewiss, evtl. nur auf Clientseite (d.h. auf dem PC).
Das heisst natuerlich nicht, dass sie fuer deinen speziellen Fall nicht trotzdem relevant sein koennten, aber es duerfte sich trotzdem lohnen, es einfach mal auszuprobieren.
Ausprobiert habe ich es (das von Martin gepostete), und (obige Vorurteile unbelassen), es scheint auf Anhieb zu funktionieren. Da ich eurem technischen Sachverstand soweit vertraue, dass ihr mir keinen voelligen Kaese empfehlt, werde ich es mal morgen naeher unter Linux antesten, unter "Kaestchengerechteren Bedingungen". Schaun mer mal... Ciao, Gerson ps. Passend zum Thema: news:87isveoj9f.fsf@msgid.grivolla.de Was haben wir gelacht! _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Am 2 Mar 2003 um 15:42 hat Gerson Kurz geschrieben / On 2 Mar 2003 at 15:42, Gerson Kurz wrote:
Im Prinzip würde ich mit einer binärkompatiblen pickle-Klasse für C++ schon zufrieden sein.
Hmm, vielleicht nicht ganz schlank, dafür aber bestimmt 100% kompatibel und vielleicht auch sonst ganz nützlich: Du kannst auch recht problemlos die libpythonXX.a zu Deinem C++- Programm dazulinken und so direkt innnerhalb Deines C++-Programms embedded ent-picklen. Viele Grüße Tino _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Gerson.Kurz@t-online.de (Gerson Kurz) writes:
Gibt es ein bestehendes RPC Modul für Python, das folgende Bedingungen erfüllt:
- Die RPC-Funktionen können von einem C/C++ Programm aus über Sockets aufgerufen werden
- Es ist ein "Leichtgewicht" sein und kein 500-Pfund-Monster (aka XML-RPC-SOAP-Gelump usw.). Insb. will ich kein BOOST oder anderes Templateungeheuer. Oh, und GPL ist nicht (das Modul darf aber dafür im Gegenzug ein paar Mark kosten).
Ich empfehle die Verwendung von TCPServer, und die Implementierung eines zeilenorientierten Protokolls. Seien etwa "foo" und "bar" Operationen, so könnte das RPC-Protokoll wie folgt lauten --> foo 3 Hallo <-- 100 HalloHalloHallo --> bar <-- 100 Thanks for asking Das verlangt auf C++-Seite absolut keine weiteren Bibliotheken (außer der Socketbibliothek), und lässt sich auf Python-Seite relativ einfach implementieren (siehe BaseHTTPServer). Ciao, Martin _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
participants (4)
-
Georg Mischler
-
Gerson.Kurz@t-online.de
-
martin@v.loewis.de
-
Tino Lange