Dos procesos (Java y Python) necesitan comunicarse en mi aplicación. Noté que la comunicación del socket toma el 93% del tiempo de ejecución. ¿Por qué la comunicación es tan lenta? ¿Debo buscar alternativas a la comunicación de socket o puedo hacerlo más rápido?Comunicación Fast IPC/Socket en Java/Python
Actualización: Descubrí una solución simple. Parece que el flujo de salida Buffered no está realmente almacenado temporalmente por algún motivo desconocido. Por lo tanto, ahora pongo todos los datos en los búferes de cadena en ambos procesos cliente/servidor. Lo escribo en el zócalo en el método de descarga.
Todavía estoy interesado en un ejemplo del uso de memoria compartida para intercambiar datos rápidamente entre procesos.
Alguna información adicional:
- tamaño del mensaje en el applicaiton está bajo 64kb mayor parte del tiempo.
- El servidor está en Java, el cliente está escrito en Python.
- El socket IPC se implementa a continuación: ¡lleva 50 ciclos y envía 200 bytes! Esto tiene que ser demasiado alto. Si envío 2 bytes en 5000 ciclos, tomará mucho menos tiempo.
- Ambos procesos se ejecutan en una máquina Linux.
- En la aplicación real se realizan aproximadamente 10 llamadas al iFid.write() del cliente en cada ciclo.
- Esto se hace en un sistema Linux.
Este es el lado del servidor:
public class FastIPC{
public PrintWriter out;
BufferedReader in;
Socket socket = null;
ServerSocket serverSocket = null;
public FastIPC(int port) throws Exception{
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
public void send(String msg){
out.println(msg); // send price update to socket
}
public void flush(){
out.flush();
}
public String recv() throws Exception{
return in.readLine();
}
public static void main(String[] args){
int port = 32000;
try{
FastIPC fip = new FastIPC(port);
long start = new Date().getTime();
System.out.println("Connected.");
for (int i=0; i<50; i++){
for(int j=0; j<100; j++)
fip.send("+");
fip.send(".");
fip.flush();
String msg = fip.recv();
}
long stop = new Date().getTime();
System.out.println((double)(stop - start)/1000.);
}catch(Exception e){
System.exit(1);
}
}
}
Y el lado del cliente es:
import sys
import socket
class IPC(object):
def __init__(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect(("localhost", 32000))
self.fid = self.s.makefile() # file wrapper to read lines
self.listenLoop() # wait listening for updates from server
def listenLoop(self):
fid = self.fid
print "connected"
while True:
while True:
line = fid.readline()
if line[0]=='.':
break
fid.write('.\n')
fid.flush()
if __name__ == '__main__':
st = IPC()
¿Qué plataforma es esta? – snim2
Linux ... me hizo la pregunta. – fodon
Necesita almacenar en búfer los datos. Enviar bytes uno por uno (o en otros trozos pequeños) es perfectamente ineficaz, no importa si se trata de una computadora local o no. –