Python multitraitement: Comment savoir à l'utilisation de la Piscine ou Processus?

J'ai donc un algorithme que je suis en train d'écrire, et la fonction multiprocess est censé appeler une autre fonction, CreateMatrixMp(), comme de nombreux processus comme il y a des processeurs en parallèle. Je n'ai jamais fait de multitraitement avant, et ne peut pas être sûr de l'une des méthodes ci-dessous est plus efficace. Le mot "efficace" dans le contexte de la fonction CreateMatrixMp() avoir besoin d'être potentiellement des milliers de fois.J'ai tout lu de la documentation sur le python multiprocessing module, et en sont venus à ces deux possibilités:

Première est l'aide de l' Pool classe:

def MatrixHelper(self, args):
    return self.CreateMatrix(*args)

def Multiprocess(self, sigmaI, sigmaX):

    cpus = mp.cpu_count()
    print('Number of cpu\'s to process WM: %d' % cpus)
    poolCount = cpus*2
    args = [(sigmaI, sigmaX, i) for i in range(self.numPixels)]

    pool = mp.Pool(processes = poolCount, maxtasksperchild= 2)
    tempData = pool.map(self.MatrixHelper, args)
    pool.close()
    pool.join()

Et la prochaine est à l'aide de la Process classe:

def Multiprocess(self, sigmaI, sigmaX):

    cpus = mp.cpu_count()
    print('Number of cpu\'s to process WM: %d' % cpus)

    processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

Pool semble être le meilleur choix. J'ai lu que cela entraîne moins de frais généraux. Et Process ne prend pas en compte le nombre de processeurs de la machine. Le seul problème est que l'utilisation de Pool de cette manière me donne l'erreur après erreur, et quand je le résoudre, il ya un nouveau-dessous. Process semble plus facile à mettre en œuvre, et pour tout ce que je sais, il peut être le meilleur choix. Qu'est-ce que votre expérience vous dire?

Si Pool doit être utilisé, puis je suis droit dans le choix de map()? Il serait préférable que l'ordre est maintenu. J'ai tempData = pool.map(...) parce que le map fonction est supposée retourner une liste des résultats de tous les processus. Je ne suis pas sûr de savoir comment Process gère ses données renvoyées.

Cela semble similaire au stackoverflow.com/questions/18176178/... Merci
J'ai lu ce poste. Cependant, je demande à certains différentes questions auxquelles il faut répondre. Il est à l'aide de deux fonctions cible alors que je suis en utiliser un, il passe pas d'arguments alors que je passe plusieurs, et il n'a pas à être préoccupés avec sa cible étant une méthode d'instance, comme la mienne. J'ai fait beaucoup de recherches sur cette mesure, et les deux Pool et Process semblent se comporter différemment dans des contextes différents, et il semble bien que l'on serait mieux dans certaines situations, tandis que dans d'autres, il ne serait pas. J'ai pensé qu'il était approprié de commencer une nouvelle question.

OriginalL'auteur Anonymous | 2015-07-29