2011-07-26 3 views
4

J'utilise actuellement python multiprocess pour faire de la programmation parallèle simple. J'utilise un décorateur asyncpython multiprocess pinning

def async(decorated): 
    module = getmodule(decorated) 
    decorated.__name__ += '_original' 
    setattr(module, decorated.__name__, decorated) 
    def send(*args, **opts): 
     return async.pool.apply_async(decorated, args, opts) 
    return send 

puis

@async 
def evalfunc(uid, start, end): 
     veckernel(Posx, Posy, Posz, Quant, Delta) 
     return (uid, GridVal) 

def runit(outdir): 
    async.pool = Pool(8) 
    results = [] 
    for uid in range(8): 
     result = evalfunc(uid,Chunks[uid], Chunks[uid+1]) 
      results.append(result) 

Si j'exécuter sur un processeur 8 ou 8 cœurs la machine utilise essentiellement deux noyaux. Pourquoi donc? Existe-t-il un moyen de faire un épinglage adéquat du noyau comme avec les pthreads?

Merci beaucoup, Mark

Répondre

1

Si la fonction appelée par apply_async (par exemple evalfunc) finitions très rapidement, tous les processus de travail dans la piscine ne peuvent pas être utilisés.

Si tel est bien votre cas, vous devez transmettre plus de données à chaque appel à evalfunc afin que chaque processus a plus à mâcher.