Question

python stackless n'a pas pris une bonne utilisation du multi-core, alors où est le point, il devrait être plus rapide que les fils python / multitraitement?

tous les tasklet python utilisation de référence de stackless pour comparer avec verrouillage de fil de python et la file d'attente, qui est injuste, serrure cause a toujours faible efficacité

voir, si l'utilisation simple appel fonction thread sans verrouiller doit être aussi efficace que python stackless

Était-ce utile?

La solution

Focus sur la fonctionnalité première et seconde de la performance (à moins que vous savez que vous avez le besoin).

La plupart du temps sur un serveur est passé avec E / S, donc multi-cœurs ne contribuent pas tant. Si elle est la plupart du temps E / S que vous travaillez avec, python multi-threading peut être la réponse la plus simple.

Si les demandes de serveur sont d'UC, puis d'avoir un processus parent (que ce soit multi-thread ou non), et les processus enfants respectifs ne fait un bon peu de bon sens.

Si vous voulez vraiment à l'échelle, vous pouvez regarder une autre plate-forme, comme Erlang. Si vous voulez vraiment à l'échelle et utiliser encore python, vous pouvez regarder Erlang distribué avec les processus Python gérés en tant que ports Erlang sur un cluster distribué.

Beaucoup d'options, mais à moins que vous avez affaire à someting gros gros , vous pourriez très probablement une approche simple.

libération anticipée, libération souvent.

Autres conseils

Il y a cette nouvelle chose à la mode appelé boucles-IO asynchrone et passage de messages-et quelques concurrency autres termes à la mode. Eh bien, ce ne est pas du tout nouveau, mais il ne fait que ces 5 dernières années d'être découvert par le grand public.

Stackless Python est une version de Python où la machine virtuelle elle-même a été modifié pour mieux soutenir ces messages et passer des boucles IO, et son tour est / filetage coroutines vert.

Il existe d'autres bibliothèques pour faire la même chose avec des outils différents, par exemple Twisted et Tornado, sur Python. Vous pouvez même exécuter hybride Twisted sur Stackless Python et ainsi de suite.

Le bit de boucle IO cartes directement, comment les sockets Berkley faire IO asynchrone, et avec un peu d'effort peut être étendu à être proactif plutôt que réactif et de travailler avec les systèmes de fichiers, ainsi que des prises de réseau, par exemple le plus récent libevent.

Pour utiliser l'échelle de côté pour plus d'un noyau est l'endroit où vous avez deux approches - multithreading ; état partagé, par exemple fils ou entre les processus - multitraitement par exemple les files d'attente de messages. Il est une limitation générale des architectures actuelles que l'approche de threads fonctionne bien pour un grand nombre de noyaux localement, alors que le passage de messages dépasse en terme de performance que le nombre de noyaux devient massif ou si ces noyaux sont sur des machines différentes. Et vous pouvez faire une approche hybride.

En raison des choix de conception internes dans la machine virtuelle Python, il est généralement pas aussi efficace à multi-threading comme multi-traitement, vous allez à plusieurs processus avec le passage de messages plus tôt que vous pourriez sur d'autres plates-formes.

Mais en général l'approche de passage de messages est un nettoyant, corriger facilement Version.

Et il y a d'autres langues qui reposent sur cette même approche avec des objectifs différents et des contraintes supplémentaires par exemple Erlang, Node.js, Clojure, Go.

Parmi ceux-ci, Clojure est peut-être le plus instructif. Lorsque vous comprenez comment les tiques Clojure, et réfléchir à pourquoi , l'ensemble des objectifs et des contraintes des autres systèmes tomberont en place ...

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