Python 2.7 simultanées.les contrats à terme.ThreadPoolExecutor ne pas paralléliser
J'exécute le code suivant sur un Intel i3-machine avec 4 cœurs virtuels (2 hyperthreads/physique de base, 64bit) et Ubuntu 14.04 installé:
n = multiprocessing.cpu_count()
executor = ThreadPoolExecutor(n)
tuple_mapper = lambda i: (i, func(i))
results = dict(executor.map(tuple_mapper, range(10)))
Le code ne semble pas être exécutée dans un mode parallèle, puisque le PROCESSEUR est utilisé à seulement 25% en permanence. Sur l'utilisation du graphe seulement l'un des 4 cœurs virtuels est utilisé à 100% à un moment. L'utilisées sont des noyaux en alternance toutes les 10 secondes.
Mais la parallélisation fonctionne bien sur une machine serveur avec le même réglage du logiciel. Je ne connais pas le nombre exact de cœurs, ni le type de processeur, mais je sais pour sûr qu'il a plusieurs carottes et l'utilisation est à 100% et que les calculs ont une rapide accélération (10 fois plus rapide après l'utilisation de la parallélisation, fait quelques expériences avec elle).
Je l'espère, que la parallélisation serait de travailler sur mon ordinateur, et pas seulement sur le serveur.
Pourquoi n'est-il pas de travail? A-t-elle quelque chose à voir avec mes paramètres de système d'exploitation? Dois-je les changer?
Merci d'avance!
Mise à jour:
Pour le fond de renseignements, voir la bonne réponse ci-dessous. Par souci d'exhaustivité, je veux donner un exemple de code qui a résolu le problème:
tuple_mapper = lambda i: (i, func(i))
n = multiprocessing.cpu_count()
with concurrent.futures.ProcessPoolExecutor(n) as executor:
results = dict(executor.map(tuple_mapper, range(10)))
Avant de le réutiliser prendre soin de toutes les fonctions que vous utilisez sont définies dans la partie supérieure au niveau d'un module comme décrit ici:
Python multitraitement de décapage de l'erreur
ProcessPoolExecutor
. Pourrait être la GIL.Intéressant, mais je suis toujours irrité par le fait que le serveur affiche 100% de l'utilisation avec et moins sans parallélisation, car il a le même logiciel logiciel de configuration. Je vais essayer vos conseils.
OriginalL'auteur Gerhard Hagerer | 2015-05-21
Vous devez vous connecter pour publier un commentaire.
Il semble que vous voyez les résultats de Python Mondial Interprète De Verrouillage (un.k.un GIL).
Que toutes vos discussions sont en cours d'exécution pure le code Python, un seul d'entre eux peut s'exécuter en parallèle. Qui devrait provoquer un seul PROCESSEUR à être actif et correspond à la description du problème.
Vous pouvez contourner ce problème en utilisant un processus multiples avec
ProcessPoolExecutor
à partir du même module. D'autres solutions incluent le passage à Jython ou IronPython qui n'ont pas de GIL.Pourquoi ne pas pypy? Je crois que pypy est libre de GIL trop.
PyPy a encore GIL selon ses FAQ
Merci pour la correction, mon mauvais, un idiot, en effet.
J'ai ce problème avec Python 3.5 dans mon Jupyter Portable Dû passer à
ProcessPoolExecutor
trop afin d'obtenir les 100% d'utilisation du PROCESSEUR est que pour la même raison?OriginalL'auteur kichik