Linux下利用ZeroMQ让C++和Python交互

77 篇文章 21 订阅
47 篇文章 2 订阅

环境

Ubuntu 14.04 + gcc/g++4.8.4 +Python 2.7

需求

最近在搞一个项目,需要让C++和Python交互,当然这种交互不是在C++中调用Python代码,而是先让C++代码处理一个程序,再把输出用Python代码处理。

网上看到有人用socket解决,可本人对socket一向排斥,然后就采用了更强大的分布式RPC框架——ZeroMQ来让二者交互。

ZeroMQ介绍

ZeroMQ本质是一个消息队列服务,它类似于socket,和socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。

ZeroMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,30us内完成消息的传输,能够兼容多个平台,多种语言,可以使用多种方式实现N对N的Socket连接。

优势

ZeroMQ作为一个更为高效的传输层,具有如下优势:

1.程序接口库是一个并发框架
2. 在集群和超级计算机上表现得比TCP更快
3. 通过inproc, IPC, TCP, 和 multicast进行传播消息
4. 通过发散,订阅,流水线,请求的方式连接
5. 对于不定规模的多核消息传输应用使用异步IO
6. 有非常大并且活跃的开源社区
7. 支持30+的语言

C++和Python交互代码

关于ZeroMQ在Ubuntu C++和Python的安装,我就不赘述了,网上有多得翻不过来的教程。我来示范下C++作为服务端和Python作为客户端的交互代码:

C++服务端代码如下:

//server.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>

int main () {
    // Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        // Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        // Do some 'work'
        sleep (1);

        // Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

编译命令:

g++ -g -Wall server.cpp -o server -lstdc++ -lzmq

也可以是更简单的:

g++ server.cpp -o server -lzmq

然后

./server

让服务端开启监听

Python客户端代码如下:

#client.py
#coding=utf-8  

import zmq

context = zmq.Context()
print 'connect to hello world server'
socket =  context.socket(zmq.REQ)
socket.connect('tcp://localhost:5555')

for request in range(1,10):
    print 'send ',request,'...'
    socket.send('hello')
    message = socket.recv()
    print 'received reply ',request,'[',message,']'

这里另开一个新的终端,直接

python client.py

就可以看到交互了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ZeroMQ是一个开源的消息传递库,它提供了高性能、异步的消息传递模式。它支持多种编程语言,包括C++。 在C++中使用ZeroMQ,你需要下载并安装ZeroMQ库。你可以从ZeroMQ的官方网站(http://zeromq.org)下载最新版本的库,并按照官方文档提供的说明进行安装。 一旦安装完成,你可以在C++代码中包含ZeroMQ的头文件,并链接ZeroMQ库。以下是一个简单的示例代码,演示如何使用ZeroMQ进行消息传递: ```cpp #include <zmq.hpp> #include <string> int main() { // 创建一个ZeroMQ上下文 zmq::context_t context(1); // 创建一个ZeroMQ套接字 zmq::socket_t socket(context, zmq::socket_type::req); // 连接到目标地址 socket.connect("tcp://localhost:5555"); // 发送消息 std::string message = "Hello, ZeroMQ!"; zmq::message_t request(message.size()); memcpy(request.data(), message.data(), message.size()); socket.send(request, zmq::send_flags::none); // 接收回复 zmq::message_t reply; socket.recv(reply, zmq::recv_flags::none); // 处理回复消息 std::string replyMessage(static_cast<char*>(reply.data()), reply.size()); std::cout << "Received reply: " << replyMessage << std::endl; return 0; } ``` 以上代码中,我们创建了一个REQ类型的套接字,并通过connect()方法连接到目标地址。然后,我们发送一条消息并接收回复。 这只是ZeroMQC++中使用的简单示例,你可以根据需要进一步探索ZeroMQ的功能和特性。希望对你有帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值