py4j入门(官方文档消化)

官方文档地址:https://www.py4j.org/contents.html

这里只列写关键代码,源码与文档中有对应。

py4j:

入门

  what:允许python编译器动态的访问JVM中的java对象,或者反过来
简单用例,Python使用GatewayServer访问JVM:
  Python端:

gateway = JavaGateway()
java_app = gateway.entry_point
java_app.addition(number1, number2)) //根据入口点调用
stack = gateway.entry_point.getStack() //根据get方法获取对象
java_list = gateway.jvm.java.util.ArrayList() //获取java的list

  Java端:

//它允许 Python 程序通过本地网络套接字与 JVM 通信。
GatewayServer server = new GatewayServer(app); 实例化entry_point
server.start();

Python里对JVM集合的切片:操作不会影响原集合,因为切片是在JVM中也做了一次拷贝,链接出的的python对象。

进阶

1 2.支持数组与collection的直接创建:

1
2
3
4
5
6
gateway = JavaGateway()
int_class = gatew
int_array = gateway.new_array(int_class,2)ay.jvm.int
arrayList = gateway.jvm.java.util.ArrayList()
set = gateway.jvm.java.util.HashSet()
map = gateway.jvm.java.util.HashMap()

  3 通过callback实现Java接口

复制代码
//接口实现类在初始化时将gateway赋值
def __init__(self, gateway):
    self.gateway = gateway

class Java:
  implements = ["Java接口全限定名"]
if __name__ == "__main__": //使用Callback参数 gateway = JavaGateway( callback_server_parameters=CallbackServerParameters()) listener = PythonListener(gateway)
复制代码

 4 线程模型

多线程模型:JavaGateway和CallbackServer,Py4j会每次创建一个线程

单线程模型:

gateway = ClientServer(
    java_parameters=JavaParameters(),
    python_parameters=PythonParameters())

Clientserver科欧

5 从java端创建一个会话

需要:

1.启动python进程,新建一个JavaGateway或ClientServer

2.创建一Python实例实现Java接口,作为python_server_entry_point参数

3.在java侧启动JavaGateway或ClientServer

4.调用getPythonServerEntryPoint获取python的entry point,得到java接口实现

使用JavaGateway:

gateway = JavaGateway(
    callback_server_parameters=CallbackServerParameters(),
    python_server_entry_point=simple_hello)

使用ClientServer:

复制代码
//java
ClientServer clientServer = new ClientServer(null);
        // We get an entry point from the Python side
        IHello hello = (IHello) clientServer.getPythonServerEntryPoint(new Class[] { IHello.class });

//Python
gateway = ClientServer(
    java_parameters=JavaParameters(),
    python_parameters=PythonParameters(),
    python_server_entry_point=simple_hello)
复制代码

6.使用动态端口:launch_gateway

7.python集合转换为java集合

gateway = JavaGateway(gateway_parameters=GatewayParameters(auto_convert=True))

python集合可以使用方法,但是作为拷贝不会被java方法修改

8 监听events:

复制代码
//Java
GatewayServer.addListener


//Python
server_started.connect(started)
gateway = JavaGateway(
    gateway_parameters=GatewayParameters(),
    callback_server_parameters=CallbackServerParameters())
复制代码

9 内存模型

  Java对象在Python侧:Java对象发送给python侧,一个对象引用会维护在java侧(Gateway中)。一旦对象在PVM被回收,则引用也会在JVM中回收。如果gateway被关闭,剩余的对象也会被回收。

Python对象在Java端,对此对象的引用会保留在python端。直到被JVM回收。

API:

py4j.clientserver

clientServer是JavaGateway的子类,完全兼容给JavaGateway的代码

JavaParameters

  

posted @   寻Meng启示  阅读(1780)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示