2010-12-01 39 views
5

J'utilise un programme python monothread qui effectue un traitement de données massif sur ma boîte de Windows. Ma machine a 8 processeurs. Lorsque je surveille l'utilisation de l'UC dans l'onglet Performances sous le Gestionnaire des tâches de Windows, cela montre que j'utilise seulement une très petite fraction de la puissance de traitement disponible pour moi. Un seul processeur est utilisé au maximum et tout le reste est presque inactif. Que dois-je faire pour m'assurer que tous mes processeurs sont utilisés? Le multithreading est-il une solution?Comment programmer pour utiliser tous les processeurs de votre machine?

+1

Oui, le multithreading est requis. – cspolton

+0

mais sans une description de votre programme, nous ne pouvons pas dire si ou comment –

+0

Aucun multithreading n'est pas nécessaire. –

Répondre

6

Vous devez générer de nouveaux processus au lieu de nouveaux threads.

Cet outil est de loin la plus simple parmi tout ce que je suis venu à travers: parallel python

Vue d'ensemble:

PP est un module python qui fournit mécanisme parallèle exécution de code python sur SMP (systèmes avec plusieurs processeurs ou noyaux ) et les clusters (ordinateurs connectés via le réseau).

Il est léger, facile à installer et à intégrer avec d'autres logiciels python.

PP est une open source et un module multi-plateforme écrit dans le plus pur python

+1

J'ai simplifié ma réponse beaucoup. Le contexte est bien sûr, coder avec Python, donc il a les limitations que vous et d'autres avez mentionné. – kakarukeys

+0

+1 pour avoir mentionné un traitement parallèle lib – invert

+0

@Forest: Vous devriez consulter http://us.pycon.org/2010/conference/schedule/event/76/ puis reconsidérer la croyance généralement répandue (généralement fausse) que certains threads peut être efficace même avec le GIL. Le GIL a des effets pratiques vraiment inhabituels qui défient ce que vous pourriez imaginer la théorie à être. –

1

En supposant que votre tâche est parallélisable, alors oui, le filetage est certainement une solution. En particulier, si vous avez beaucoup d'éléments de données à traiter, mais ils peuvent tous être traités indépendamment alors il devrait être relativement simple de paralléliser.

L'utilisation de plusieurs processus au lieu de plusieurs threads pourrait être une autre solution - vous ne nous en avez pas assez parlé du problème à dire, vraiment.

+0

En fait, les processus multiples * sont * la solution la plus générique, car la propagation de plusieurs threads du même processus sur plusieurs cœurs peut ne pas être prise en charge sur une plate-forme/un système d'exploitation donné. – knitti

+0

@knitti: La question concerne spécifiquement Windows. Il y a beaucoup de fois où l'utilisation de plusieurs processus serait incommode au point d'infaisabilité où les threads ne seraient pas trop mauvais. –

+0

désolé, je dois évidemment parfaire mes compétences en lecture ... mais par curiosité: pourquoi pensez-vous que plusieurs processus seraient ce inconvénient? – knitti

2

Le multithreading est requis pour un seul processus, mais ce n'est pas nécessairement une solution; L'affinité du processeur peut le restreindre à un sous-ensemble de cœurs disponibles même si vous avez plus que suffisamment de threads pour tout utiliser.

+0

Voulez-vous vraiment dire «ce n'est pas une solution» ou «cela ne pourrait pas être une solution»? L'affinité du processeur sera-t-elle vraiment un problème? –

+0

@Jon: Mise à jour –

+0

Super, merci. Fait beaucoup plus de sens. Je me demandais s'il y avait un handicap dans Python qui causerait des problèmes. –

2

vous pouvez obtenir que si votre programme est du type qui bénéficierait à l'aide python's multiprocessing module

multitraitement utilise processus python multiples qui évite les problèmes avec le GIL il est donc possible d'utiliser tous ces noyaux avec code python, il a un carte facile filetée et la base de systèmes plus complexes

est similaire à parallèle python, mais est limitée à la machine locale et est inclus avec python 2.6 et supérieur et est métaphoriquement similaire à enfiler de python

+0

Veuillez développer votre réponse. Je ne comprends pas ce que vous essayez de dire. – invert

2

en complément ce que Jon a dit, si vous utilisez le interpréteur Python standard, vous devez comprendre les limitations en ce qui concerne le multi-threading. Si vos threads sont en pure-python et ne font pas d'appels système, ils ne peuvent pas s'exécuter simultanément sur plusieurs processeurs à cause du Global Interpreter Lock, donc les avantages du multi-threading sont minimes. Dans ce cas, la recommandation serait peut-être d'utiliser plusieurs processus à la place ou de passer à une autre implémentation Python telle que JPython ou IronPython, qui n'ont pas de verrou Global Interpreter. Le multithreading ne peut pas utiliser des processeurs ou des noyaux supplémentaires.

1

faire.

Brisez votre tâche en étapes ou en étapes. Chaque étape lit quelque chose, fait partie du calcul global et écrit quelque chose.

"""Some Step.""" 
import json 
for some_line in sys.stdin: 
    object= json.loads(some_line) 
    # process the object 
    json.dump(result, sys.stdout) 

Quelque chose comme ça devrait bien se passer.

Si vous avez plusieurs objets à communiquer, créez un dictionnaire simple des objets.

results = { 'a': a, 'b': b } 

Connectez-les dans un pipeline, comme ceci.

python step1.py | python step2.py | python step3.py >output_file.dat 

Si vous pouvez diviser les choses en 8 étapes ou plus, vous utiliserez 8 cœurs ou plus. Et, BTW, ce sera incroyablement rapide pour très peu de travail réel.