2009-05-24 8 views

Antwort

7

Es hängt davon ab, wie Sie Ihre Apps interagieren lassen möchten. In der POSIX-Umgebung haben Sie Pipes, Shared Memory, Sockets, Semaphore und Message Queues. Siehe diese Frage: Comparing unix linux IPC für weitere Informationen.

Was ist das Interaktionsmodell für Ihre Prozesse (d. H. Client/Server, Producer-Consumer usw.)?

Aus persönlicher Erfahrung würde ich vorschlagen, Ihre beste Wette wäre Pipes (da sie nur Dateien zum Lesen und Schreiben von Bytes sind) oder Sockets (da beide Sprachen sie unterstützen).

+0

Hauptverbraucher und mehrere dumme (aber hocheffiziente) Produzenten. – SyRenity

+0

Wie schnell sind die Rohre oder Steckdosen im Vergleich zum Shared Memory? – SyRenity

+0

@SyRenity, ziemlich schnell. Hängt davon ab, wie viel Sie sperren und welche Sperre Sie wirklich verwenden. Auch +1, Named Pipes sind cool. –

4

Wie Mikelong sagte, hängt das sehr davon ab, was Sie tun. AFAIK, keine der IPC-Methoden haben native Java-Bindungen, also wirst du wahrscheinlich JNI verwenden und Bindungen selbst erstellen müssen, also sind die verschiedenen Methoden ungefähr gleich schwer. Wenn Sie jedoch eine Nachrichtenübermittlung durchführen, empfehle ich dringend, Nachrichtenwarteschlangen zu verwenden. Sie sind sehr einfach zu benutzen (sobald Sie die Bindungen haben), und haben eine gute Leistung. Wenn Sie einige Ressourcen "freigeben" müssen, dann möchten Sie wahrscheinlich mit Shared Memory bleiben.

Da es klingt, als ob Sie eine Art Client/Server-Sache haben, würde ich sagen, entweder Nachrichtenwarteschlangen, Unix-Domain-Sockets oder Named Pipes verwenden. Sie alle beinhalten das Kopieren von Daten in den Kernel, also sind sie nicht ganz so schnell wie Shared Memory, aber sie sind immer noch sehr schnell. Wenn Sie nachrichtenähnliche Daten (einzelne kleine Pakete) haben, wechseln Sie zu Nachrichtenwarteschlangen. Das ist wahrscheinlich die sauberste Lösung. Wenn Sie einen größeren Datenstrom haben, verwenden Sie Pipes oder Sockets. Sockets haben den Vorteil, dass sie später leicht transparent (wie X11) vernetzt werden können, aber sie sind etwas schwieriger zu bearbeiten als Pipes. Die Leistung ist wahrscheinlich sehr ähnlich.

+0

Nur um einige binäre Daten zu verschieben - aber so schnell wie möglich. – SyRenity

+0

Ich benutze tatsächlich JNA für IPC und es funktioniert gut - aber wieder, die allgemeine Unannehmlichkeit von Shared Memory (Segmente übrig, etc ...) sind ein Mörder. – SyRenity

+0

Unterstützt Java Unix-Domain-Sockets? Möglicherweise benötigen Sie dazu eine Add-On-Lib. Wenn Ihre Daten aus ein paar festen Strukturen bestehen, gehen Sie mit Nachrichtenwarteschlangen. Sie sind schnell und einfach zu bedienen. Wenn die Daten variabler und streamartiger sind, dann gehe mit Named Pipes. – Duck

0

Obwohl wahrscheinlich nicht die effizienteste, Java unterstützt nur Sockets out of the box (das beste, das ich mich erinnere). Sie sind sehr flexibel, nur vielleicht nicht so schnell wie andere Optionen. Wie Zifre bereits erwähnt hat, bietet es Ihnen die Möglichkeit zur Netzwerktransparenz sowie Sprache/verbindliche Transparenz. Wie so ziemlich jede Sprache unterstützt heutzutage eine Socket-Bibliothek out-of-the-box.

Während ich Effizienz aus dem Fenster werfen, wenn Sie es auf die nächste Ebene bringen möchten, könnten Sie dies wahrscheinlich in einen Web-Service irgendeiner Art einwickeln. Verwenden Sie einen eingebetteten Webserver für den Verbraucher, an den die Produzenten ihre Daten senden.

0

Die einfachste Möglichkeit zur Kommunikation zwischen Anwendungen in verschiedenen Sprachen ist IMHO CORBA. Es gibt sehr gute Open Source CORBA ORBs da draußen. Wir verwenden TAO für C++ und JacORB für Java. Es gibt auch Unternehmen wie OCI und Remedy, die technische Unterstützung bieten.

+0

CORBA wäre in dieser Situation IMO Overkill. Es ist leicht zu vergessen, wie viel Arbeit in die Einrichtung der ORBs, das Lernen von CORBA, IDL usw. investiert wird. Es ist eine entmutigende Aussicht für jemanden, der nur einige Daten auf derselben Maschine weitergeben möchte, viel davon unstrukturiert, was ein bisschen wie eine PITA ist in CORBA. – Duck

+0

@Duck nach meiner Erfahrung ist es einfacher zu lernen, wie man CORBA verwendet, als die Sprache/Plattform Kommunikation manuell korrekt zu tun. Nur um die richtige Kombination zu erreichen, kann ein Albtraum sein. Nicht zu vergessen all die netten Dienste (Benennung, Event, ...), die man sofort nutzen kann. – lothar

+0

Meinst du das ernst ?? KOBRA? In 2012? Ich bin mir sicher, dass es eine nette Technologie ist und die Tatsache, dass es tot ist, ist unglücklich und traurig, aber es ist immer noch tot. –

-6

Ich verwende derzeit Shared Memory für IPC zwischen Java und C++ - Anwendungen, , aber auf der Suche nach einer bequemeren Alternative.

Kann jemand eine bessere Methode empfehlen, aber mit der gleichen Geschwindigkeit?

Für einfache Shared Memory Sie brauchen nicht einmal eine spezielle Bibliothek:

class Main { 
    private static class CustomThread extends Thread { 
     public int x = 0; 
     public void run() { 
      x = 5; 
     } 
    } 

    public static void main(String[] args) { 

     CustomThread t = new CustomThread(); 
     t.start(); 

     System.out.println(t.x); 
     System.out.println(t.x); 
    } 
} 

Die lokale Variable x außerhalb des Threads und innerhalb zugegriffen werden, so dass Sie es verwenden, um Informationen in die und aus passieren des Threads.