Быстрая связь IPC / Socket в Java / Python

В моем приложении должны взаимодействовать два процесса (Java и Python). Я заметил, что связь через сокет занимает 93% времени выполнения. Почему общение такое медленное? Следует ли мне искать альтернативы обмену данными через сокеты или это можно сделать быстрее?

Обновление: я обнаружил простое исправление.Похоже, что поток вывода с буферизацией на самом деле не буферизуется по какой-то неизвестной причине. Итак, теперь я помещаю все данные в строковые буферы в процессах клиент / сервер. Пишу в сокет в методе flush.

Меня все еще интересует пример использования разделяемой памяти для быстрого обмена данными между процессами.

Некоторая дополнительная информация:

  1. Размер сообщения в приложении в большинстве случаев меньше 64 КБ.
  2. Сервер на Java, клиент написан на Python.
  3. Socket IPC реализован ниже: требуется 50 циклов, отправка 200 байт! Это должно быть слишком высоко. Если я отправлю 2 байта за 5000 циклов, это займет намного меньше времени.
  4. Оба процесса работают на одной машине Linux.
  5. В реальном приложении за каждый цикл выполняется около 10 вызовов клиентской iFid.write ().
  6. Это сделано в системе Linux.

Это сторона сервера:

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()
7
задан fodon 12 February 2012 в 22:13
поделиться