【发布时间】:2012-03-04 06:31:53
【问题描述】:
两个进程(Java 和 Python)需要在我的应用程序中进行通信。我注意到套接字通信占用了 93% 的运行时间。为什么通讯这么慢?我应该寻找套接字通信的替代方案还是可以更快?
更新:我发现了一个简单的修复方法。由于某种未知原因,缓冲的输出流似乎没有真正缓冲。因此,我现在将所有数据放入客户端/服务器进程中的字符串缓冲区中。我在flush方法中将它写入套接字。
我仍然对使用共享内存在进程之间快速交换数据的示例感兴趣。
一些附加信息:
- 应用程序中的消息大小大部分时间都在 64kb 以下。
- 服务器用Java编写,客户端用Python编写。
- Socket IPC 实现如下:发送 200 个字节需要 50 个周期!这一定是太高了。如果我在 5000 个周期内发送 2 个字节,则需要的时间会少很多。
- 两个进程都在一台 Linux 机器上运行。
- 在实际应用程序中,每个周期对客户端的 iFid.write() 进行大约 10 次调用。
- 这是在 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()
【问题讨论】:
-
Linux ...修改了问题。
-
你需要缓存数据。一个接一个(或以其他小块)发送字节是完全无效的,无论它是否是本地计算机。
-
out 是这里的缓冲流。
-
ZeroMQ 非常适合。