我的应用程序中需要两个进程(Java和Python)进行通信。我注意到套接字通信占据了93%的运行时间。为什么通信很慢?我该寻找套接字通信的替代方案还是可以使其更快?
更新:我发现了一个简单的解决方法。出于某种未知原因,缓冲输出流并不真正被缓冲。因此,我现在将所有数据都放入客户端/服务器进程的字符串缓冲区中,并在flush方法中将其写入套接字。
我仍然对使用共享内存快速交换进程之间数据的示例感兴趣。
一些额外的信息:
1. 应用程序中的消息大小大多数情况下低于64kb。
2. 服务器使用Java编写,客户端使用Python编写。
3. 实现了套接字IPC如下:发送200字节需要50个周期!这肯定太高了。如果我在5000个周期中发送2个字节,它需要更少的时间。
4. 两个进程都在一台Linux机器上运行。
5. 在实际应用中,每个周期会对客户端的iFid.write()进行约10次调用。
6. 在Linux系统上完成此操作。这是服务器端:
更新:我发现了一个简单的解决方法。出于某种未知原因,缓冲输出流并不真正被缓冲。因此,我现在将所有数据都放入客户端/服务器进程的字符串缓冲区中,并在flush方法中将其写入套接字。
我仍然对使用共享内存快速交换进程之间数据的示例感兴趣。
一些额外的信息:
1. 应用程序中的消息大小大多数情况下低于64kb。
2. 服务器使用Java编写,客户端使用Python编写。
3. 实现了套接字IPC如下:发送200字节需要50个周期!这肯定太高了。如果我在5000个周期中发送2个字节,它需要更少的时间。
4. 两个进程都在一台Linux机器上运行。
5. 在实际应用中,每个周期会对客户端的iFid.write()进行约10次调用。
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()