Rapide IPC/communication par Socket en Java/Python

Deux processus (Java et Python) nécessité de communiquer dans mon application. J'ai remarqué que le support de communication prend 93% du temps d'exécution. Pourquoi la communication est-elle si lente? Dois-je être à la recherche d'alternatives à la prise de communication ou cela peut-il être fait plus rapidement?

Mise à jour: j'ai découvert une solution simple. Il semble que la mémoire Tampon du flux de sortie n'est pas vraiment mis en mémoire tampon pour une raison inconnue. Donc, je vais maintenant mettre toutes les données dans la chaîne de tampons dans les deux client/serveur de processus. Je l'écris à la douille de la méthode flush.

Je suis toujours intéressé par un exemple de l'utilisation de la mémoire partagée pour échanger rapidement des données entre les processus.

Quelques informations supplémentaires:

  1. De taille de Message dans le formulaire est en vertu de 64 ko, la plupart du temps.
  2. Le serveur est en Java, le client est écrit en Python.
  3. Prise de la CIB est mis en œuvre ci-dessous: il faut 50 cycles de l'envoi de 200 octets ! Cela a obtenu d'être trop élevé. Si j'envoie les 2 octets de 5000 cycles, il prend beaucoup moins de temps.
  4. Les deux processus s'exécutent sur une machine Linux.
  5. Dans l'application réelle d'environ 10 appels des clients de l'iFid.write() sont effectués à chaque cycle.
  6. Cela se fait sur un système Linux.

C'est le côté serveur:

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

Et le côté client est:

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()
Quelle plate-forme est-ce sur?
Linux ... règlements ultérieurs de la question.
Vous avez besoin de la mémoire tampon les données. L'envoi d'octets un par un (ou dans d'autres petits morceaux) est parfaitement inefficace, peu importe si c'est l'ordinateur local ou pas.
est un tampon flux ici.
ZeroMQ serait un bon ajustement pour cela.

OriginalL'auteur fodon | 2012-02-12