Domanda

Ho scritto una piccola applicazione Python e qui puoi vedere come appare Task Manager durante una corsa tipica.
(fonte: weinzierl.name )

Mentre l'applicazione è perfettamente multithread, non sorprende che usi solo un core della CPU. Indipendentemente dal fatto che la maggior parte dei moderni linguaggi di scripting supporta il multithreading, gli script possono essere eseguiti solo su un core della CPU .

Ruby, Python, Lua, PHP possono essere eseguiti solo su un singolo core. Anche Erlang, che si dice sia particolarmente utile per la programmazione concorrente, è interessato.

Esiste un linguaggio di scripting integrato supporto per thread che non sono limitati a un singolo core?

WRAP UP

Le risposte non erano esattamente quelle che mi aspettavo, ma the < code> TCL rispondi si avvicina. Vorrei aggiungere perl , che (molto simile a TCL ) ha thread basati su interprete.

Jython, IronPython e Groovy rientrano nell'ombrello della combinazione di un linguaggio collaudato con il comprovato macchina virtuale di un'altra lingua. Grazie per i tuoi suggerimenti in questo direzione.

Ho scelto la risposta di Aiden Bell come < em> Risposta accettata . Non suggerisce una lingua particolare ma la sua osservazione è stata molto perspicace per me.

È stato utile?

Soluzione

La sintassi del thread può essere statica, ma l'implementazione tra i sistemi operativi e le macchine virtuali può cambiare

Il tuo linguaggio di scripting potrebbe utilizzare il threading vero su un sistema operativo e i thread falsi su un altro.

Se si hanno requisiti prestazionali, potrebbe valere la pena cercare di assicurarsi che i thread con script passino al livello più vantaggioso nel sistema operativo. I thread dello spazio utente saranno più veloci, ma per bloccare in gran parte l'attività dei thread i thread del kernel saranno migliori.

Altri suggerimenti

Sembra che tu usi una definizione di " linguaggio di scripting " ciò potrebbe sollevare alcune sopracciglia e non so cosa questo implichi per le altre vostre esigenze.

Hai considerato TCL? Farà quello che vuoi, credo.

Dal momento che stai includendo nella tua lista linguaggi abbastanza generici, non so quanto un'implementazione sia accettabile per te. Sarei sorpreso se una delle implementazioni di Zillion Scheme non riguardasse i thread nativi, ma dalla parte superiore della mia testa, riesco solo a ricordare il MzScheme abituato ma mi sembra di ricordare che il supporto è stato abbandonato. Certamente alcune delle implementazioni LISP comuni lo fanno bene. Se Embeddable Common Lisp (ECL) funziona, potrebbe funzionare per te. Non lo uso però, quindi non sono sicuro di quale sia lo stato del suo supporto di threading, e questo può ovviamente dipendere dalla piattaforma.

Aggiorna Inoltre, se ricordo bene, GHC Haskell non fa esattamente quello che stai chiedendo, ma può fare effettivamente ciò che vuoi poiché, di nuovo, come ricordo, girerà di thread nativo per core o giù di lì e poi esegui i suoi thread su quelli ....

Puoi effettuare il multi-thread liberamente con il linguaggio Python in implementazioni come Jython (su JVM, come dice Groovy di @Reginaldo) e IronPython (su .NET). Per l'implementazione classica di CPython del linguaggio Python, come menziona il commento di @ Dan, multiprocessing (piuttosto che threading ) è il modo di usare liberamente tutti i core che hai a disposizione

Poiché Groovy si basa sulla macchina virtuale Java, ottieni supporto per thread reali.

F # su .NET 4 offre un eccellente supporto per la programmazione parallela e prestazioni estremamente buone, nonché il supporto per i file .fsx appositamente progettati per gli script. Faccio tutto il mio scripting usando F #.

Una risposta a questa domanda è già stata accettata, ma solo per aggiungere che oltre a tcl, l'unico altro linguaggio di script interpretato che conosco che supporta il multithreading e la programmazione thread-safe è Qore .

Qore è stato progettato dal basso verso l'alto per supportare il multithreading; ogni aspetto del linguaggio è thread-safe; il linguaggio è stato progettato per supportare la scalabilità SMP e il multithreading in modo nativo. Ad esempio, è possibile utilizzare l'operatore background per avviare un nuovo thread o la classe ThreadPool per gestire un pool di thread. Qore genererà anche eccezioni con errori di thread comuni in modo che gli errori di threading (come potenziali deadlock o errori con le API di threading come tentare di afferrare un blocco già trattenuto dal thread corrente) siano immediatamente visibili al programmatore.

Qore supporta inoltre e filtra risorse; ad esempio, un'allocazione DatasourcePool viene trattata come una risorsa thread-local; se si dimentica di eseguire il commit o il rollback di una transazione prima di terminare il thread, la gestione delle risorse del thread per la classe DatasourcePool ripristinerà automaticamente la transazione e genererà un'eccezione con informazioni intuitive sul problema e come è stato risolto.

Forse potrebbe esserti utile: una panoramica delle funzionalità di Qore è qui: Perché usare Qore? .

CSScript in combinazione con Estensioni parallele non dovrebbe essere una cattiva opzione. Scrivi il tuo codice in puro C # e quindi eseguilo come script.

Non è correlato al meccanismo di threading. Il problema è che (ad esempio in Python) è necessario ottenere l'istanza dell'interprete per eseguire lo script. Per acquisire l'interprete è necessario bloccarlo poiché manterrà il conteggio dei riferimenti, ecc. Ed è necessario evitare l'accesso simultaneo a questi oggetti. Python usa pthread e sono dei veri thread ma quando lavori con oggetti python solo un thread sta eseguendo altri in attesa. Lo chiamano GIL (Global Interpreter Lock) ed è il problema principale che rende impossibile il vero parallelismo all'interno di un processo.

https://wiki.python.org/moin/GlobalInterpreterLock

Gli altri linguaggi di scripting potrebbero presentare lo stesso problema.

Guile supporta i thread POSIX che credo siano thread hardware.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top