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?
Répondre
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
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
+1 pour avoir mentionné un traitement parallèle lib – invert
@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. –
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.
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
@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. –
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
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.
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? –
@Jon: Mise à jour –
Super, merci. Fait beaucoup plus de sens. Je me demandais s'il y avait un handicap dans Python qui causerait des problèmes. –
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
Veuillez développer votre réponse. Je ne comprends pas ce que vous essayez de dire. – invert
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.
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.
- 1. Meilleure pratique pour utiliser plusieurs processeurs XML?
- 2. Quelle est votre méthode de marquage "folksonomy" pour les fichiers sur votre machine locale?
- 3. Comment programmer la dernière heure de connexion à une machine?
- 4. Comment configurer matlabpool pour plusieurs processeurs?
- 5. parallèle Linq - Utiliser plus de threads que les processeurs (pour les tâches liées non CPU)
- 6. Comment utiliser C++/CLI pour programmer des applications Winforms
- 7. Comment référence sur les processeurs multi-core
- 8. nvidia cuda en utilisant tous les cœurs de la machine
- 9. Développement de noyaux pour supporter plusieurs processeurs
- 10. Comment indiquer à la machine JVM Hotspot si elle doit utiliser la synchronisation de threads à un ou plusieurs processeurs?
- 11. Utiliser votre propre API pour construire votre site
- 12. Comment programmer les préférences utilisateur
- 13. Comment programmer setObjectClass pour NSArrayController
- 14. Comment puis-je modifier mon script Perl pour utiliser plusieurs processeurs?
- 15. Comment programmer pour faire correspondre
- 16. Comment trouver tous les navigateurs installés sur une machine
- 17. Compilation pour les processeurs Intel et PPC sous OSX
- 18. Comment utiliser jQuery (ou similaire) pour extraire tous les CSS
- 19. Comment utiliser common_scope pour tous les modèles ActiveRecord
- 20. comment tester un api twitter sur votre machine locale
- 21. Python tordu: comment programmer?
- 22. Comment programmer un programme
- 23. Énumération de tous les objets d'implémentation IDispatch sur une machine
- 24. Développement basé sur Windows pour les processeurs ARM
- 25. Puis-je utiliser matlab pour programmer une voiture télécommandée?
- 26. Comment accéder au "fichier nsf" si les notes Lotus ne sont pas installées sur votre machine?
- 27. Comment utiliser SharpSVN pour programmer "ajouter à la liste d'ignorés" pour un dossier
- 28. TFS pour les applications de la machine
- 29. Nommez-vous tous les assemblages utilisés par votre produit?
- 30. Wordpress.com utiliser un ensemble de tables pour tous les utilisateurs?
Oui, le multithreading est requis. – cspolton
mais sans une description de votre programme, nous ne pouvons pas dire si ou comment –
Aucun multithreading n'est pas nécessaire. –