Quale approccio per l'integrazione del codice Python in un'applicazione principalmente Scala hai usato una seconda volta perché ha avuto successo? [chiuso]

2

Ho un'applicazione principalmente Scala e sono interessato ad approcci per integrare il codice Python in questa applicazione in un modo che è stato provato personalmente per avere successo.

In questo contesto

  • integrare significa consentire al codice Scala di chiamare il codice Python, in qualche modo, e utilizzare i risultati o accedere all'eccezione
  • successo significa che l'approccio è stato utilizzato più di una volta perché consente alle due lingue di collaborare per fornire valore aziendale e l'approccio è stato utilizzato una seconda volta dallo stesso team

Speriamo che questa domanda ammetta risposte concrete piuttosto che discussioni perché sto chiedendo osservazioni fattuali. Tuttavia se questo è troppo soggettivo, mentre chiudi questo, potresti suggerire uno di

  • Come posso porre questa domanda in modo non soggettivo OPPURE
  • Indicami un sito in cui posso porre questo tipo di domanda.

Grazie.

    
posta Janek Bogucki 22.12.2017 - 17:36
fonte

2 risposte

2

Acquisisci risultati tramite una variabile e cattura le eccezioni tramite STDERR come segue:

in Scala:

import sys.process._
def callPython(){
    val result = "python /fullpath/mypythonprogram.py" ! ProcessLogger(stdout append _, stderr append _)
    println(result)
    println("stdout: " + stdout)
    println("stderr: " + stderr)

}

e in Python:

try:
    throws()
    return 0
except Exception, err:
    sys.stderr.write('Exception: %sn' % str(err))
    return 1

Per ulteriori approfondimenti vedi il pacchetto processo qui . Visita anche ProcessBuilder qui e ProcessLogger qui

    
risposta data 23.12.2017 - 23:54
fonte
3

Non ci sarà una sola risposta a questo perché ogni caso è diverso e tutti gli approcci sono stati utilizzati con successo da diversi team.

In generale ci sono tre approcci:

  1. Se entrambe le lingue hanno lo stesso runtime, è possibile compilare entrambe le lingue su quel runtime e utilizzare un'interfaccia di funzione esterna. In questo scenario, si utilizza Jython e Scala, entrambi eseguiti su JVM. Questo è generalmente il più veloce e il meno oneroso, ma dovrai affrontare qualche impedenza nel modo in cui ogni lingua tratta gli oggetti nella loro lingua, e non hai alcun isolamento in modo che codice mal scritto in entrambe le lingue possa mandare in crash l'altro. Inoltre, può essere complicato ridimensionarlo su più macchine.
  2. È possibile generare sottoprocessi durante l'elaborazione di ciascuna richiesta nell'app principale. Il processo principale comunica con il sottoprocesso eseguendo lo streaming dei dati utilizzando stdin e stdout, e possibilmente altre pipe o qualsiasi altro IPC specifico del sistema operativo. Questo è generalmente il migliore se i sottoprocessi sono un tipo filtro che può essere utilizzato in una pipeline. Ci sarà un po 'di overhead nella creazione di sottoprocessi per ogni richiesta principale, ma se lo fai su un sistema basato su Unix come Linux, creare un nuovo processo è molto veloce in quanto il sistema è ottimizzato per questo.
  3. È possibile creare un uso di comunicazione tra processi e comunicare con un microservizio utilizzando un'API che passa il messaggio. Esempio di ciò è eseguire un microservizio che esegue un server di applicazioni HTTP o che comunica con socket di dominio. Con questo approccio, si ha un certo overhead dovuto al rendering, alla copia dei messaggi e all'analisi dei messaggi, quindi è meglio usarlo quando i messaggi sono a grana grossa piuttosto che fare molte piccole chiamate. Dovrai progettare un'API esplicita, ma questo approccio è di solito più semplice a lungo termine e può essere reso più robusto dal momento che gli arresti anomali sono separati e non influenzeranno gli altri processi. Questo approccio è anche molto più semplice da scalare poiché avere un'API esplicita rende più semplice l'esecuzione di processi su macchine diverse.
risposta data 24.12.2017 - 06:28
fonte

Leggi altre domande sui tag