详解Python如何与 java高效的交互

 更新时间:2023年06月12日 09:23:51   作者:大话性能  
这篇文章主要为大家介绍了详解Python如何与java高效的交互的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题背景

项目过程中可能会遇到,java 从数据库取了很多数据,但 java 本身不方便处理,所以传递给 python 去处理,如何传?

解决方法

调研了一些方法,譬如可以直接在 java 中调研 python,传入参数的方式,或者数据先存储到 excel 中,然后 python 去 excel 中读取,但是这些方法还是存在不便利和性能会有限制。之后,我尝试了增加个 rabbitmq 消息中间件进行不同语言之间的通信交互。

MQ 是消费 - 生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ 和 JMS 类似,但不同的是 JMS 是 SUN JAVA 消息中间件服务的一个标准和 API 定义,而 MQ 则是遵循了 AMQP 协议的具体实现和产品。RabbitMQ 是一个在 AMQP 基础上完成的,可复用的企业消息系统。

上图是简单抽象的描述,具体到 rabbitmq 有很多详细的概念,这里不一一详述。当然,我们上面也说过 ,rabbitmq 是 AMQP 协议的一个开源实现,所以其内部实际上也是 AMQP 中的基本概念,包括:Message(消息)、Publisher(消息生产者),Exchange(交换器),Binding(绑定),Queue(消息队列),Connection(网络连接),Channel(信道),Consumer(消息消费者),Virtual Host(虚拟主机),Broker(消息队列服务器)。

实际例子

生产者使用 java,往队列中写入待处理的消息。

java 代码(即生产者)

public class Producer1 {
    public final static String QUEUE_NAME="data";
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException{
        long startTime=System.currentTimeMillis(); //获取开始时间
        //数据准备
        List<testObj> list = MockData.mockData();
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ相关信息
        factory.setHost("192.168.43.211");
        factory.setUsername("test");
        factory.setPassword("123456");
        //factory.setPort(5672);
        //创建一个新的连接
        Connection connection = factory.newConnection();
        //创建一个通道
        Channel channel = connection.createChannel();
        //声明一个队列        
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        List<testObj> list1 = new ArrayList<testObj>();
        list1 = new MockData().mockData();
        //发送消息到队列中
        ObjectMapper mapper=new ObjectMapper();
        String message = mapper.writeValueAsString(list1);
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        //关闭通道和连接
        channel.close();
        connection.close();
        long endTime=System.currentTimeMillis(); //获取结束时间  
        System.out.println("程序运行时间: "+(endTime-startTime)/1000.0+"s");
    }
}

消费者使用 python 代码,从消息队列中获取 java 生成者发送的消息进行处理。

python 代码(即消费者)

if __name__ == '__main__':
    starttime = datetime.datetime.now()
    # 创建socket链接
    credentials = pika.PlainCredentials('test', '123456')
    connection = pika.BlockingConnection(pika.ConnectionParameters(
     '192.168.43.211', 5672, '/', credentials))
    # 创建管道
    channel = connection.channel()
    # 创建队列
    queue_name = 'data'
    channel.queue_declare(queue_name)
    # 如果接受到消息就调用回调函数,准备接受消息
    # 声明回调函数
    def callback(ch, method, properties, body):
        message = json.loads(body.decode())
        endtime = datetime.datetime.now()
        print("拿数据时间:{}".format(endtime - starttime))
        list = message
        for i in list:
            print(i)
    channel.basic_consume(callback, queue=queue_name, no_ack=False)
    channel.start_consuming()

我们可以看到 python 顺利拿到 java 传输的数据,至于你拿到数据后,后面要做什么复杂的操作、分析,那就是看你自己的需要了。

另外,你不妨尝试把模拟数据条数提高到 10 万条甚至更多, rabbitmq 基本能保持稳定有效。

小结

在解决不同语言程序之间数据传输问题上,方法各异,rabbitmq 是一个很好的选择,处理数据量大,且从时间效率上来说也快,而且很方便的进行系统的解耦。

以上就是详解Python如何与 java高效的交互的详细内容,更多关于Python与java 高效的交互的资料请关注脚本之家其它相关文章!

相关文章

  • python实现将一个数组逆序输出的方法

    python实现将一个数组逆序输出的方法

    今天小编就为大家分享一篇python实现将一个数组逆序输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python中拆分字符串的操作方法

    Python中拆分字符串的操作方法

    这篇文章主要介绍了Python中拆分字符串的操作方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • python实现移动木板小游戏

    python实现移动木板小游戏

    这篇文章主要为大家详细介绍了python实现移动木板小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 详解python3 GUI刷屏器(附源码)

    详解python3 GUI刷屏器(附源码)

    这篇文章主要介绍了详解python3 GUI刷屏器(附源码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python可视化神器pyecharts绘制折线图详情

    Python可视化神器pyecharts绘制折线图详情

    这篇文章主要介绍了Python可视化神器pyecharts绘制折线图详情,折线图和柱状图一样是我们日常可视化最多的一个图例,当然它的优势和适用场景相信大家肯定不陌生,要想快速的得出趋势,抓住趋势二字,就会很快的想到要用折线图来表示了
    2022-07-07
  • Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式

    这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Python 可视化调色盘绘制

    Python 可视化调色盘绘制

    这篇文章主要介绍了Python 可视化调色盘绘制,文章首先通过导入模块并加载图片展开全文介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现

    TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现

    今天小编就为大家分享一篇TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • django 自定义用户user模型的三种方法

    django 自定义用户user模型的三种方法

    这篇文章主要介绍了django 自定义用户user模型的三种方法,需要的朋友可以参考下
    2014-11-11
  • Python使用chrome配置selenium操作详解

    Python使用chrome配置selenium操作详解

    这篇文章主要为大家详细介绍了chrome配置selenium操作的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论