2009-05-24 11 views

Respuesta

7

Depende de cómo planee que sus aplicaciones interactúen. En el entorno POSIX, tiene canalizaciones, memoria compartida, sockets, semáforos y colas de mensajes. Consulte esta pregunta: Comparing unix linux IPC para obtener más información.

¿Cuál es el modelo de interacción para sus procesos (es decir, cliente/servidor, productor-consumidor, etc.)?

Por experiencia personal, sugeriría que su mejor opción serían las tuberías (ya que son solo archivos para leer y escribir bytes) o tomas de corriente (ya que ambos idiomas las admiten).

+0

Principal consumidor y varios productores tontos (pero altamente eficientes). – SyRenity

+0

¿Qué tan rápido las tuberías o enchufes, en comparación con la memoria compartida? – SyRenity

+0

@SyRenity, bastante rápido. Depende de cuánto bloqueas y qué bloqueo utilizas realmente. También +1, las tuberías con nombre son geniales. –

4

Como dijo mikelong, esto depende mucho de lo que esté haciendo. AFAIK, ninguno de los métodos IPC tiene enlaces nativos de Java, por lo que probablemente tenga que usar JNI y hacer enlaces usted mismo, por lo que todos los métodos diferentes son más o menos igual de difíciles. Sin embargo, si está enviando mensajes, le recomiendo usar colas de mensajes. Son muy fáciles de usar (una vez que tienes los enlaces) y tienen un buen rendimiento. Si necesita "compartir" algún recurso, entonces probablemente quiera quedarse con la memoria compartida.

Como parece que está teniendo algún tipo de cliente/servidor, diría que utiliza colas de mensajes, sockets de dominio de Unix o conductos con nombre. Todos implican copiar datos en el núcleo, por lo que no son tan rápidos como la memoria compartida, pero aún así son muy rápidos. Si tiene datos similares a mensajes (paquetes pequeños individuales), vaya con colas de mensajes. Esa es probablemente la solución más limpia. Si tiene más de una secuencia de datos, use tuberías o zócalos. Los sockets tienen la ventaja de que puede hacer que sea más transparente (como X11) más adelante si lo desea, pero son un poco más difíciles de trabajar que las tuberías. El rendimiento es probablemente muy similar.

+0

Solo busca mover algunos datos binarios, pero lo más rápido posible. – SyRenity

+0

En realidad estoy usando JNA para IPC y funciona bien, pero una vez más, la inconveniencia general de la memoria compartida (segmentos sobrantes, etc ...) es un asesino. – SyRenity

+0

¿Admite Java los sockets de dominio Unix? Es posible que necesite una lib add-on para eso. Si sus datos constan de algunas estructuras fijas, vaya con colas de mensajes. Son rápidos y fáciles de usar. Si los datos son más variables y parecidos a un flujo, entonces vaya con canalizaciones con nombre. – Duck

0

Aunque probablemente no sea la más eficiente, Java solo admite sockets de fábrica (lo mejor que recuerdo). Son muy flexibles, tal vez no tan rápido como otras opciones. Como lo mencionó Zifre, te deja una oportunidad para la transparencia de la red, así como la transparencia del lenguaje/enlace; ya que prácticamente todos los idiomas admiten una biblioteca de socket de forma inmediata.

Mientras estoy tirando la eficiencia fuera de la ventana, si desea llevarlo al siguiente nivel, probablemente podría envolver esto en un servicio web de algún tipo. Use un servidor web incorporado en el consumidor para que los productores envíen sus datos a.

0

La forma más fácil de comunicarse entre aplicaciones escritas en diferentes idiomas es IMHO CORBA. Hay muy buena fuente abierta CORBA ORBs por ahí. Usamos TAO para C++ y JacORB para Java. También hay empresas como OCI y Remedy que brindan asistencia técnica.

+0

CORBA sería excesivo en esta situación IMO. Es fácil olvidar cuánto trabajo entra en la configuración de los ORB, aprender CORBA, IDL, etc. Es una perspectiva desalentadora para alguien que solo quiere pasar algunos datos en la misma máquina, muchos de ellos sin estructurar, que es un poco de un PITA. en CORBA. – Duck

+0

@Duck en mi experiencia, es más fácil aprender cómo usar CORBA que hacer la comunicación cruzada de lenguaje/plataforma manualmente de manera correcta. Solo para obtener toda la coordinación/demarshalling correcto puede ser una pesadilla. Por no mencionar todos los buenos servicios (nombres, eventos, ...) que uno puede usar de manera inmediata. – lothar

+0

¿Hablas en serio? ¿COBRA? ¿En 2012? Estoy seguro de que es una buena tecnología y el hecho de que esté muerta es desafortunada y triste, pero todavía está muerta. –

-6

Actualmente estoy usando memoria compartida para IPC entre aplicaciones Java y C++, pero buscando una alternativa más conveniente.

¿Alguien puede aconsejar un mejor método, pero con la misma velocidad de rendimiento?

para la memoria compartida simple que ni siquiera necesita una biblioteca especial:

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); 
    } 
} 

puede acceder a la variable local x fuera del hilo y en el interior, lo que le permite utilizarlo para pasar información dentro y fuera del hilo.

Cuestiones relacionadas