Due processi (Java e Python) devono comunicare nella mia applicazione. Ho notato che la comunicazione socket prende il 93% del tempo di esecuzione. Perché la comunicazione è così lenta? Dovrei essere in cerca di alternative alla comunicazione socket o questo può essere reso più veloce?Comunicazione IPC/Socket veloce in Java/Python
Aggiornamento: ho scoperto una soluzione semplice. Sembra che il flusso di output bufferizzato non sia realmente bufferizzato per qualche motivo sconosciuto. Quindi, ora inserisco tutti i dati nei buffer di stringa in entrambi i processi client/server. Lo scrivo nel socket nel metodo flush.
Sono ancora interessato ad un esempio dell'utilizzo della memoria condivisa per lo scambio rapido di dati tra processi.
Alcune informazioni aggiuntive:
- dimensioni Messaggio nella applicaiton è sotto 64kb maggior parte del tempo.
- Il server è in Java, il client è scritto in Python.
- Il socket IPC è implementato di seguito: ci vogliono 50 cicli per inviare 200 byte! Questo deve essere troppo alto. Se invio 2 byte in 5000 cicli, ci vuole molto meno tempo.
- Entrambi i processi vengono eseguiti su una macchina Linux.
- Nell'applicazione reale vengono eseguite ogni 10 chiamate al client iFid.write().
- Questo è fatto su un sistema Linux.
Questo è il lato server:
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);
}
}
}
E il lato client è:
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()
Quale piattaforma è attiva? – snim2
Linux ... ha ammesso la domanda. – fodon
È necessario bufferizzare i dati. L'invio di byte uno alla volta (o in altri piccoli blocchi) è perfettamente inefficace, indipendentemente dal fatto che sia un computer locale o meno. –