Inoltre, se non in Python o Java, sceglieresti più generalmente una lingua tipizzata in modo statico o un linguaggio di tipo dinamico?Python vs. Java: quale sceglieresti per programmare in modo concorrente e perché?
risposta
Vorrei scegliere JVM su python, principalmente perché il multi-threading in Python è impedito dallo Global Interpreter Lock. Tuttavia, è improbabile che Java sia il migliore quando si esegue sulla JVM. Clojure o Scala (usando attori) sono entrambi suscettibili di essere più adatto a problemi multi-thread.
Se si sceglie Java, è consigliabile prendere in considerazione l'utilizzo delle librerie java.util.concurrent ed evitare le primitive multi-threading come sincronizzato.
Il problema del blocco dell'interprete globale viene risolto semplicemente con più di un interprete: D http://docs.python.org/dev/library/multiprocessing.html – badp
multi-threading non è certamente l'unico metodo di concorrenza –
Se tu usi Java, ottieni 'Concurrency Java in Practice' e ti prepari a trascorrere 3-4 mesi buoni per superarlo. La concorrenza è una questione spinosa in qualsiasi lingua. –
Definitivamente Stackless Python! Che una variante di Python fatta apposta per la concorrenza.
Ma alla fine dipende dalla piattaforma di destinazione e da ciò che si sta cercando di ottenere.
Se non in Java/Python, dovrei utilizzare il linguaggio funzionale poiché tenere conto degli effetti collaterali è una delle complessità della scrittura di software concorrenti. (Per quanto riguarda la tua domanda: questo è tipicamente statico, ma il compilatore ha dedotto la maggior parte del tempo)
Personalmente selezionerei F #, visto che ho visto molti buoni esempi di scrittura di software concorrente con facilità usando esso.
Come introduzione: quest'uomo è equally fun as inspiring, anche un must have se non sei interessato a F # come mai.
Ricorda che F # è ** completamente ** diverso da python e java poiché richiede di sapere .net ed è pure funzionale. –
F # non è pura funzionalità, è possibile scrivere qualsiasi programma con esso senza scrivere una riga di codice funzionale. – Peter
Non penso che l'argomento riguardi la scelta della lingua o la digitazione statica o dinamica - è tra due modelli di concorrenza - memoria condivisa e passaggio di messaggi. Quale modello ha più senso nella tua situazione & la tua lingua scelta ti permette di fare una scelta o sei obbligato ad adottare un modello rispetto all'altro?
Perché non dare un'occhiata a Erlang (che ha tipizzazione dinamica) e message passing, il Actor model, e leggere perché Joe Armstrong doesn't like shared memory. C'è anche un'interessante discussione sulla concorrenza di java che utilizza i lock e i thread here on SO.
Non conosco Python, ma Java, insieme al modello integrato di serrature e fili, ha un framework di passaggio mesasge chiamato Kilim.
Vorrei usare Java, tramite Jython. Java ha una forte capacità di thread e può essere scritto usando la sintassi Python con Jython, così hai il meglio dei due mondi.
Python stesso non è molto buono con la concorrenza ed è comunque più lento di Java.
Ma se avete problemi di concorrenza e le mani libere, mi piacerebbe dare un'occhiata a Erlang, perché è stata progettata per questo tipo di problemi. Naturalmente, è necessario considerare Erlang solo se si dispone:
- tempo per padroneggiare un (molto) la nuova tecnologia
- il controllo su una parte ragionevole della catena di produzione, dal momento che Erland bisogno di alcuni adattamenti nella vostra cassetta degli attrezzi per adattarsi
@ user359996 il tuo commento potrebbe dare ad alcune persone l'impressione che Jython non possa gestire la concorrenza. Può, proprio come Java. Adoro Jython perché ti dà la potenza di tutte le classi Java pre-progettate, incluso Swing ecc., Combinate con la semantica di Python. A volte sono curioso di sapere come le persone gestiscono semplici GUI in Python perché l'essenza delle GUI è sicuramente multithreading ... Ho avuto grandi risultati con Jython ... qualsiasi modulo veramente veloce può essere scritto in Java e integrato molto facilmente. .. –
Per la concorrenza, vorrei utilizzare Java. Usando Java, in realtà intendo lo Scala, che prende in prestito molto dai costrutti di concorrenza di Erlang, ma è (probabilmente) più accessibile a uno sviluppatore Java che non ha mai usato prima.
I thread Python soffrono di dover attendere il Global Interpreter Lock, rendendo la concorrenza reale (all'interno di un singolo processo) irrealizzabile per i programmi associati alla CPU. Come ho capito, Stackless Python risolve alcune (anche se non tutte) delle mancanze di concorrenza di CPython, ma poiché non l'ho usato, non posso davvero consigliarlo.
Per alcune attività, Python è troppo lento. Il tuo programma Java a thread singolo potrebbe essere più veloce della versione concomitante di Python su un computer multi-core ...
Mi piacerebbe usare Java o Scala, F # o semplicemente andare a C++ (MPI e OpenMPI).
L'ambiente Java (librerie JVM +) è migliore per la concorrenza di (C) Python, ma Java il linguaggio fa schifo. Probabilmente andrei con un altro linguaggio sulla JVM - Jython è già stato menzionato, e Clojure e Scala hanno entrambi un eccellente supporto per la concorrenza.
Clojure è particolarmente utile, poiché supporta strutture dati persistenti ad alte prestazioni, agenti e memoria transazionale del software. È un linguaggio dinamico, ma puoi dargli suggerimenti sui tipi per ottenere prestazioni altrettanto buone di Java.
Guarda this video su InfoQ di Richard Hickey (creatore di Clojure) sui problemi con gli approcci tradizionali alla concorrenza e su come lo gestisce Clojure.
Guarderei Objective-C e Foundation Framework. È prevista una programmazione simultanea asincrona.
Questo ovviamente dipende dal tuo accesso agli Strumenti per gli sviluppatori di Apple o GnuStep, ma se hai accesso a uno dei due è un buon percorso da seguire con la programmazione concorrente.
Nessuno dei due. La programmazione concorrente è notoriamente difficile da correggere. Esiste la possibilità di utilizzare un linguaggio di programmazione orientato al processo come occam-pi basato sull'idea di communicating sequential processes e pi calculus. Ciò consente il controllo del tempo di compilazione per deadlock e molti altri problemi che si presentano durante lo sviluppo di sistemi concorrenti. Se non ti piace occam-pi, che non ti biasimo se non lo fai, puoi provare la nuova lingua da google che implementa anche una versione di CSP.
Verifica tempo compilazione per deadlock ?! Sono curioso di studiare su come funziona – Setzer
La risposta è che dipende. Ad esempio, stai cercando di sfruttare più core o cpus su una singola macchina o vuoi distribuire l'attività su più macchine? Quanto è importante la velocità rispetto alla facilità di implementazione?
Come accennato in precedenza, Python ha il Global Interpreter Lock ma è possibile utilizzare il modulo multiprocessing. Si noti che mentre Stackless è molto bello, è won't utilise multiple cores da solo. Python è generalmente considerato più semplice da utilizzare rispetto a Java. Se la velocità è una priorità, Java è solitamente più veloce.
La libreria java.util.concurrent
in Java semplifica la scrittura di applicazioni concorrenti su una singola macchina, ma è comunque necessario sincronizzarsi con qualsiasi stato condiviso. Mentre Java non è necessariamente la lingua migliore per la concorrenza, ci sono un sacco di strumenti, librerie, documentazione e migliori pratiche là fuori per aiutare.
L'utilizzo del trasferimento di messaggi e dell'immutabilità invece dei thread e dello stato condiviso è considerato l'approccio migliore alla programmazione di applicazioni concorrenti. Di conseguenza, i linguaggi funzionali che scoraggiano la mutevolezza e gli effetti collaterali sono spesso preferiti. Se la distribuzione delle applicazioni concorrenti su più macchine è un requisito, vale la pena esaminare i runtime progettati per questo ad es. Erlang o Scala Actors.
hai considerato Erlang? – jldupont
Penso che il sistema di tipi abbia poco a che fare con ciò che funziona meglio per la concorrenza. Ciò richiede altre cose, imho. – Joey
Più uso Java, più mi piace Python. Me? scontroso? Perché lo chiedi? – retracile