Limite de processus du Pool de Python multiprocessing

en utilisant L'objet Pool du module multiprocessing, le nombre de processus est-il limité par le nombre de cœurs CPU? Par exemple: si j'ai 4 cœurs, même si je crée un Pool avec 8 Processus, seulement 4 seront lancés en même temps?

28
demandé sur rottentomato56 2013-11-18 07:37:09

4 réponses

, Vous pouvez demander autant de processus que vous le souhaitez. Toute limite qui peut exister sera imposée par votre système d'exploitation, pas par multiprocessing . Par exemple,

 p = multiprocessing.Pool(1000000)

est susceptible de subir une mort horrible sur n'importe quelle machine. Je l'essaie sur ma boîte pendant que je tape ceci, et L'OS est en train de broyer mon disque pour empoussiérer l'échange de RAM madly - finalement tué après qu'il ait créé environ 3000 processus ; -)

quant au nombre de personnes qui vont courir "à la fois", Python n'a rien à dire. Cela dépend de:

  1. combien de votre matériel est capable de fonctionner simultanément; et,
  2. Comment votre système d'exploitation décide de donner des ressources matérielles à tous les processus sur votre machine en cours d'exécution.

pour les tâches liées au CPU, il ne fait pas sens pour créer plus Pool processus que vous avez cœurs de les exécuter. Si vous essayez d'utiliser votre machine pour d'autres choses, alors vous devriez créer moins de processus de cœurs.

Pour les I/O-lié tâches, il peut faire sens pour créer un tout à fait un peu plus Pool processus de cœurs, car le processus sera probablement passer la plupart de leur temps bloqué (en attente d'e/S à compléter).

33
répondu Tim Peters 2013-11-18 04:04:27

Oui. Théoriquement, il n'y a pas de limite sur les processus que vous pouvez créer, mais un nombre insensé de processus commencés à la fois causera la mort du système en raison de l'épuisement de la mémoire. Notez que les processus occupent une empreinte beaucoup plus grande que les threads car ils n'utilisent pas d'espace partagé entre eux mais utilisent un espace individuel pour chaque processus.

donc, la meilleure pratique consiste à utiliser un sémaphore limité au nombre de processeurs de votre système. probablement

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

Si vous n'êtes pas au courant du nombre de cœurs de votre système ou si vous souhaitez utiliser le code dans de nombreux systèmes, un générique de code comme ci-dessous ne...

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  

P. S. mais il est bon d'utiliser le nombre de cœurs-1 toujours.

Espérons que cela aide :)

18
répondu Sravan K Ghantasala 2017-02-14 13:10:08

c'est exact. Si vous avez 4 cœurs, alors 4 processus peuvent être lancés en même temps. Rappelez-vous que vous avez des choses système qui doit aller de l'avant, et il serait agréable pour vous de définir le numéro de processus à number_of_cores - 1 . C'est une préférence et non obligatoire. Pour chaque processus que vous créez Il y a des frais généraux, donc vous utilisez plus de mémoire pour le faire. Mais si RAM n'est pas un problème, vas-y. Si vous utilisez Cuda ou une autre bibliothèque basée sur GPU alors vous avez un paradigme différent, mais c'est une autre question.

6
répondu Back2Basics 2017-02-14 13:14:35

bien qu'il n'y ait pas de limite que vous pouvez définir, si vous cherchez à comprendre un nombre pratique à utiliser pour les processus liés au CPU (que je soupçonne que vous recherchez ici), vous pouvez exécuter ce qui suit:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1

quelques bonnes notes sur les limitations (en particulier sous linux) sont notées dans la réponse ici :

5
répondu Steve D. 2017-05-23 12:17:41