В моем приложении должны взаимодействовать два процесса (Java и Python). Я заметил, что связь через сокет занимает 93% времени выполнения. Почему общение такое медленное? Следует ли мне искать альтернативы обмену данными через сокеты или это можно сделать быстрее?
Обновление: я обнаружил простое исправление.Похоже, что поток вывода с буферизацией на самом деле не буферизуется по какой-то неизвестной причине. Итак, теперь я помещаю все данные в строковые буферы в процессах клиент / сервер. Пишу в сокет в методе flush.
Меня все еще интересует пример использования разделяемой памяти для быстрого обмена данными между процессами.
Некоторая дополнительная информация:
Это сторона сервера:
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);
}
}
}
А сторона клиента:
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()