本地程序间数据流传输的TCP/IP替代方案?
我有一个GNU C++程序和一个Python脚本,它们需要频繁地互相传递字符串,大约每分钟70到80条消息。它们会在CentOS系统上运行,并且是在同一个环境中。虽然TCP/IP可以完成这个任务,但我还有哪些其他选择呢?
需要注意的是,我不能把我的C++程序变成一个共享库(SO),然后用ctypes把它集成到我的Python脚本中,因为我的C++程序必须编译成32位,而我的Python脚本必须是64位。
4 个回答
2
http://tldp.org/LDP/tlk/ipc/ipc.html
- 管道
- 命名管道
- TCP套接字
- UNIX域套接字
- 消息队列
- 共享内存
我个人更喜欢使用TCP套接字。
- 你已经为它们写好了支持代码,
- 它们在不同机器之间和同一台机器内部都能很好地工作。
- 有很棒的工具可以帮助你调试通信通道。
- 还有一些库可以帮助你更方便地使用它们。
5
命名管道是标准的方法。在Python中可以这样使用:
import os
os.mkfifo('/some/path')
# Reading process
with open('/some/path') as pipe:
for line in pipe:
# Do what you need
# Writing process
with open('/some/path', 'w') as pipe:
while True: # Whatever looping process you have
pipe.write('<data>' + '\n')
需要注意的是,在现代系统上,每分钟70到80条消息并不算太高,TCP仍然是一个可行的选择。另外,要小心不要让任何字符串超过管道的缓冲区大小(通常是64K)。
根据评论中的建议,我还添加了一个UNIX域套接字的例子,如果你需要双向通信,这种方法会更有用。
# Server Side
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind("/some/path")
sock.listen(1)
conn, addr = sock.accept()
while True:
data = conn.recv(1024)
if not data:
break
# Let's echo it back as an example
conn.send(data)
conn.close()
# Client Side
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/some/path")
while True: # Your sending loop
# In this case we send hello world, and print what we get back.
sock.send('Hello, world')
data = sock.recv(1024)
print data
sock.close()
9
如果你已经有了一个TCP或UDP服务器,最简单的方法可能就是切换到UNIX域套接字。
UNIX域套接字有“流式”和“数据报”两种模式,就像TCP和UDP套接字一样,而且它们总是本地的,因为它们使用的是文件系统的命名空间(而不是像TCP/UDP那样使用端口号)。