web-dev-qa-db-fra.com

python prend-il en charge la programmation multiprocesseur / multicœur?

Quelle est la différence entre la programmation multiprocesseur et la programmation multicœur? afficher de préférence des exemples dans python comment écrire un petit programme pour la programmation multiprogrammation et multicœur

69
gath

Il n'existe pas de programmation "multiprocesseur" ou "multicœur". La distinction entre les ordinateurs "multiprocesseurs" et "multicœurs" ne vous concerne probablement pas en tant que programmeur d'applications; cela a à voir avec les subtilités de la façon dont les cœurs partagent l'accès à la mémoire.

Pour tirer parti d'un ordinateur multicœur (ou multiprocesseur), vous avez besoin d'un programme écrit de telle manière qu'il puisse être exécuté en parallèle, et d'un runtime qui permettra au programme d'être réellement exécuté en parallèle sur plusieurs cœurs (et système d’exploitation, bien que tout système d’exploitation que vous pouvez exécuter sur votre PC le fasse). Il s'agit vraiment de programmation parallèle , bien qu'il existe différentes approches de la programmation parallèle. Ceux qui sont pertinents pour Python sont multiprocessing et multithreading.

Dans des langages comme C, C++, Java et C #, vous pouvez écrire des programmes parallèles en exécutant plusieurs threads. Le verrou d'interpréteur global dans les exécutions CPython et PyPy exclut cette option; mais seulement pour ces temps d'exécution. (À mon avis, le multithreading est dangereux et délicat et c'est généralement une bonne chose que Python vous encourage à ne pas le considérer comme un moyen d'obtenir un avantage de performance .)

Si vous souhaitez écrire un programme parallèle qui peut s'exécuter sur plusieurs cœurs en Python, vous avez quelques options différentes:

  • Écrivez un programme multithread en utilisant le module threading et exécutez-le dans le runtime IronPython ou Jython.
  • Utilisez le module processing , (maintenant inclus dans Python 2.6 comme module multiprocessing ), pour exécuter votre code dans plusieurs processus à la fois.
  • Utilisez le module subprocess pour exécuter plusieurs interprètes python et communiquer entre eux.
  • Utilisez Twisted et Ampoule . Cela a l'avantage non seulement d'exécuter votre code sur différents processus, mais (si vous ne partagez pas l'accès à des choses comme les fichiers) potentiellement sur différents ordinateurs également.

Peu importe laquelle de ces options vous choisissez, vous devrez comprendre comment diviser le travail que votre programme fait en morceaux qui ont du sens à séparer. Comme je ne sais pas quel type de programmes vous envisagez d'écrire, il serait difficile de fournir un exemple utile.

96
Glyph

Comme mentionné dans un autre article Python 2.6 a le module multiprocessing , qui peut tirer parti de plusieurs cœurs/processeurs (il contourne GIL en démarrant plusieurs processus de manière transparente). Il propose des primitives similaires au module de threading. Vous trouverez des exemples (simples) d'utilisation dans les pages de documentation.

24
rslite

Vous pouvez réellement écrire des programmes qui utiliseront plusieurs processeurs. Vous ne pouvez pas le faire avec des threads à cause du verrou GIL, mais vous pouvez le faire avec un processus différent. Non plus:

  • utilisez le module sous-processus , et divisez votre code pour exécuter un processus par processeur
  • jetez un œil au module parallelpython
  • si vous utilisez python> 2.6 regardez le module multiprocess .
5
Mapad

Vous pouvez lire sur le multithreading en python et le threading en général

Multithreading en Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/

2
milot

Si je comprends bien les choses, Python a quelque chose appelé le GIL (Global Interpreter Lock) qui rend effectivement impossible de tirer parti des multicœurs lors de plusieurs threads en Python.

Voir par exemple Guido van Rossum entrée de blog sur le sujet. Pour autant que je sache, parmi les langages "traditionnels", seuls C/C++ et Java ont un support efficace pour les multicœurs.

2
lindelof

La principale différence réside dans la façon dont vous organisez et distribuez les données. Le multicœur a généralement des bandes passantes plus élevées entre les différents cœurs d'un processeur, et le multiprocesseur doit impliquer davantage le bus entre les processeurs.

Python 2.6 a obtenu multiprocessus (processus, comme dans l'exécution de programme) et plus d'objets de synchronisation et de communication pour la programmation multithread.

Si vous n'avez pas Python 2.6 (ce que vous n'avez pas si vous utilisez Ubuntu Edgy ou Intrepid par exemple), vous pouvez utiliser le code Google rétroporté Il fait partie de PyPI, ce qui signifie que vous pouvez facilement l'installer à l'aide d'EasyInstall (qui fait partie du paquet python-setuptools dans Ubuntu).

0
Gert