Question

J'ai écrit une petite application python et vous pouvez voir ici à quoi ressemble le gestionnaire de tâches au cours d'une exécution typique.
(source: weinzierl.name )

Alors que l’application est parfaitement multithread, il n’est pas surprenant qu’elle utilise un seul cœur de processeur. Indépendamment du fait que la plupart des langages de script modernes prennent en charge le multithreading, les scripts ne peuvent être exécutés que sur un seul cœur de processeur .

Ruby, Python, Lua, PHP ne peuvent s’exécuter que sur un seul cœur. Même Erlang, qui serait particulièrement efficace pour la programmation simultanée, en est affecté.

Existe-t-il un langage de script intégré? support pour les threads qui ne sont pas confinés à un seul noyau?

RETOURNER

Les réponses n'étaient pas tout à fait ce à quoi je m'attendais, mais the < code> TCL réponse s'approche. J'aimerais ajouter perl , qui (comme TCL ) a des threads basés sur un interpréteur.

Jython, IronPython et Groovy est sous le parapluie de la combinaison d'un langage éprouvé avec machine virtuelle d'une autre langue. Merci pour vos conseils dans ce direction.

J'ai choisi la réponse d'Aiden Bell en tant que < em> Réponse acceptée . Il ne suggère pas un langage particulier mais sa remarque m'a été très perspicace.

Était-ce utile?

La solution

La syntaxe des threads peut être statique, mais la mise en œuvre sur les systèmes d'exploitation et les machines virtuelles peut changer

Votre langage de script peut utiliser un véritable thread sur un système d'exploitation et de faux threads sur un autre.

Si vous avez des exigences en matière de performances, il peut être intéressant de s’assurer que les threads scriptés tombent sur la couche la plus bénéfique du système d’exploitation. Les threads de l'espace utilisateur seront plus rapides, mais les threads du noyau seront plus efficaces pour bloquer en grande partie les activités des threads.

Autres conseils

Vous semblez utiliser une définition du " langage de script " cela peut soulever quelques sourcils et je ne sais pas ce que cela implique pour vos autres besoins.

Quoi qu'il en soit, avez-vous pensé à TCL? Je pense que cela fera ce que vous voulez.

Étant donné que vous incluez des langages à usage général dans votre liste, je ne sais pas à quel point une implémentation est acceptable pour vous. Je serais surpris que l'une des mises en œuvre de zillion Scheme ne corresponde pas aux threads natifs, mais je ne peux me souvenir que de la mémoire de MzScheme, mais il me semble que le support a été abandonné. Certes, certaines des implémentations Common LISP le font bien. Si l'option Embeddable Common Lisp (ECL) est compatible, cela pourrait fonctionner pour vous. Je ne l'utilise pas, donc je ne suis pas sûr de l'état de sa prise en charge des threads, et cela dépendra bien sûr de la plate-forme.

Mise à jour De plus, si je me souviens bien, GHC Haskell ne fait pas tout à fait ce que vous demandez, mais peut effectivement faire ce que vous voulez, car, encore une fois, si mes souvenirs sont bons thread natif par noyau ou alors, puis exécutez ses threads sur ceux ....

Vous pouvez librement créer plusieurs threads avec le langage Python dans des implémentations telles que Jython (sur la machine virtuelle, @Reginaldo mention Groovy is) et IronPython (sur .NET). Pour l’implémentation classique du langage Python par CPython, comme le mentionne le commentaire de @ Dan, multitraitement (plutôt que threading ) est le moyen d’utiliser librement autant de cœurs que vous avez disponible

Comme Groovy est basé sur la machine virtuelle Java, vous bénéficiez d'une assistance pour les vrais threads.

F # on .NET 4 offre une excellente prise en charge de la programmation parallèle et de très bonnes performances, ainsi que des fichiers .fsx spécialement conçus pour les scripts. Je fais tous mes scripts en utilisant F #.

La réponse à cette question a déjà été acceptée, mais il faut ajouter que, à part tcl, le seul autre langage de script interprété que je connaisse qui prenne en charge la programmation multithreading et thread-safe est Qore .

Qore a été conçu de bas en haut pour prendre en charge le multithreading; chaque aspect de la langue est thread-safe; le langage a été conçu pour prendre en charge l'évolutivité SMP et le multithreading de manière native. Par exemple, vous pouvez utiliser l'opérateur background pour démarrer un nouveau thread ou la classe ThreadPool pour gérer un pool de threads. Qore lancera également des exceptions avec des erreurs de threads communes afin que les erreurs de threading (telles que les blocages potentiels ou les erreurs avec les API de threading, telles que la tentative de saisir un verrou déjà détenu par le thread actuel) soient immédiatement visibles par le programmeur.

Qore prend également en charge et met en réseau des ressources; Par exemple, une allocation DatasourcePool est traitée comme une ressource locale au niveau du thread. Si vous oubliez de valider ou d'annuler une transaction avant de terminer votre thread, la gestion des ressources de thread pour la classe DatasourcePool annule automatiquement la transaction et lève une exception avec des informations conviviales sur le problème et comment cela a été résolu.

Peut-être que cela pourrait vous être utile - voici un aperçu des fonctionnalités de Qore: Pourquoi utiliser Qore? .

CSScript en combinaison avec Les extensions parallèles ne devraient pas être une mauvaise option. Vous écrivez votre code en C # pur, puis vous l'exécutez en tant que script.

Cela n’est pas lié au mécanisme de threading. Le problème est que (par exemple en python) vous devez obtenir une instance d'interprète pour exécuter le script. Pour acquérir l'interpréteur, vous devez le verrouiller car il conservera le nombre de références, etc., et devra éviter tout accès simultané à ces objets. Python utilise pthread et ce sont de vrais threads, mais lorsque vous travaillez avec des objets Python, un seul thread en exécute d'autres en attente. Ils appellent cela GIL (Global Interpreter Lock) et c’est le principal problème qui rend impossible le vrai parallélisme dans un processus.

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

Les autres langages de script peuvent avoir le même problème.

Guile prend en charge les threads POSIX qui, à mon avis, sont des threads matériels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top