nuovo rilascio del layer , che permette l'accesso completo delle applicazioni Python alle librerie di classi Java. Con JPype, è possibile utilizzare le librerie specifiche di Java da Python, creando applicazioni ibride che combinano codice Java e Python. A differenza di Jython, l'integrazione con Java non avviene attraverso una variante di Python per la JVM, ma attraverso un'interazione a livello di entrambe le macchine virtuali, utilizzando la memoria condivisa. Questo approccio consente non solo di ottenere buone prestazioni, ma fornisce anche accesso a tutte le librerie CPython e Java. Il codice del progetto sotto licenza Apache 2.0.
Principali modifiche:
- È stata aggiunta una cache nelle chiamate ai metodi per evitare la risoluzione delle sovraccarichi, riducendo notevolmente l'impatto sulle prestazioni della risoluzione dei metodi, specialmente quando la stessa sovraccarico viene chiamata molte volte, come durante l'esecuzione di cicli.
- La trasmissione di liste, tuple e buffer in array di primitivi Java è stata accelerata da 4 a 100 volte, a seconda del tipo di dati. La conversione utilizza un'elaborazione ottimizzata dei buffer in memoria, anziché l'API Sequence. Quando si incontra un buffer Python, solo il primo elemento viene controllato per la conversione, poiché i buffer di dati sono omogenei.
- La gestione delle operazioni di spegnimento (introdotta già in JPype 1.0.0, ma trascurata nella preparazione della lista delle modifiche). JPype ora invoca la procedura di shutdown della JVM, che tenta di uscire in modo "gracefully". Questo porta a diversi cambiamenti nel comportamento. I thread in background (chiamata proxy) ora possono mantenere aperta la JVM fino al loro completamento. Le chiamate Proxy gestiranno lo shutdown fino alla conclusione della chiamata, ma riceveranno un messaggio di interruzione. I file vengono ora chiusi correttamente e i dati vengono scaricati su disco (flush), se i thread gestiscono l'eccezione nel modo corretto. Vengono eseguite le operazioni di pulizia delle risorse e i finalizzatori. Durante la creazione dei thread vengono invocati i hook AtExit. Attraverso un demone, viene implementata l'auto-connessione dei thread quando si utilizza la JVM da Python. Un codice errato, che non riesce a gestire correttamente la pulizia del thread, potrebbe bloccarsi durante l'esecuzione dello shutdown. Ulteriore documentazione è disponibile nel manuale d'uso.
- Il wrapper per Throwable riceveva un wrapper per Object invece del risultato atteso, causando strane conversioni da classi Python.
- Correzioni degli errori di battitura nel sistema di importazione che portano all'errore '»jname» non trovato'.
- Assicurato il corretto avanzamento di «^C» in KeyboardInterrupt.
- Risolto il problema con i caratteri in Python 3.5.3. PySlice_Unpack è stato introdotto nella successiva patch (3.5.4) e non doveva essere utilizzato.
- Analizzato l'errore con numpy.linalg.inv che causava il crash. Il problema è stato rintracciato all'interazione dei thread tra JVM e alcune versioni di numpy. La soluzione proposta è chiamare numpy.linalg.inv prima di avviare la JVM.
Fonte: opennet.ru
