2010-05-25 3 views
0

J'ai un algorithme de type map-reduce simple, que je veux implémenter en python et utiliser plusieurs cœurs.Difficulté à utiliser python sans pile, impossible d'écrire dans un dict

J'ai lu quelque part que les threads utilisant le module de thread natif dans 2.6 n'utilisent pas plusieurs cœurs. Est-ce vrai?

J'ai même mis en œuvre à l'aide de python stackless mais je reçois dans des erreurs étranges [Mise à jour: une recherche rapide a montré que la pile moins ne permet à plusieurs noyaux Ainsi sont leur toute autre alternative?]

def Propagate(start,end): 
print "running Thread with range: ",start,end 
def maxVote(nLabels): 
    count = {} 
    maxList = [] 
    maxCount = 0 
    for nLabel in nLabels: 
     if nLabel in count: 
      count[nLabel] += 1 
     else: 
      count[nLabel] = 1 
    #Check if the count is max 
     if count[nLabel] > maxCount: 
      maxCount = count[nLabel]; 
      maxList = [nLabel,] 
     elif count[nLabel]==maxCount: 
      maxList.append(nLabel) 
    return random.choice(maxList)   

for num in range(start,end): 
    node=MapList[num] 
    nLabels = [Label[k] for k in Adj[node]] 
    if (nLabels!=[]): 
     Label[node] = maxVote(nLabels) 
    else: 
     Label[node]=node 

Cependant, dans le code ci-dessus, les valeurs attribuées à Label, c'est-à-dire le changement de dictionnaire, sont perdues.

Au-dessus de la fonction de propagation est utilisé comme appelable pour microfiletages (c.-à-tasklets)

Répondre

1

Utilisez le module multiprocessing de la bibliothèque standard - il imite l'interface du module threading (pour faciliter le portage d'un code multithread existant) et peut utiliser pleinement tous les noyaux que vous avez. threading et stackless sont tous les deux single-core (et en effet, stackless est non-préemptif, donc la programmation est très différente de la programmation pour le threading ou le multitraitement).

+0

Spécifiquement, multiprocessing.map() est _incredibly_ utile. – carl

Questions connexes