web-dev-qa-db-fra.com

Python programmation multicœur

Veuillez considérer une classe comme suit:

class Foo:
    def __init__(self, data):
        self.data = data

    def do_task(self):
        #do something with data 

Dans mon application, j'ai une liste contenant plusieurs instances de la classe Foo. Le but est d'exécuter do_task pour tous les objets Foo. Une première implémentation est tout simplement:

 #execute tasks of all Foo Object instantiated
 for f_obj in my_foo_obj_list:
     f_obj.do_task()

J'aimerais profiter d'une architecture multicœur partageant le cycle for entre 4 CPU de ma machine.

Quelle est la meilleure façon de procéder?

11
Larry

Vous pouvez utiliser pools de processus dans le module de multitraitement.

def work(foo):
    foo.do_task()

from multiprocessing import Pool

pool = Pool()
pool.map(work, my_foo_obj_list)
pool.close()
pool.join()
17
timrau

Au lieu de passer par toutes les bases du multithreading/multicœur, je voudrais faire référence à un article de Ryan W. Smith: Programmation multicœur et distribuée en Python

Il expliquera en détail comment vous pouvez utiliser plusieurs cœurs et utiliser ces concepts. Mais faites attention à ce genre de choses si vous n'êtes pas familier avec les concepts généraux du multithreading.

Programmation fonctionnelle vous permettra également de personnaliser l'algorithme/la fonction pour chaque cœur.

8
Dr.Elch