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的直接創建:

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM