2017-01-04 8 views
0

Ich versuche, einen Pool von identischen Prozessen auf einer Reihe von Kernen gleichzeitig auszuführen. Dies ist eine vereinfachte Version meines Codes. Es scheint, als ob meine Funktion nie von map_async aufgerufen wird, und der Code wird blockiert (direkt nach print (4)). Irgendeine Idee?multiprocessing.pool.map_async führt meine Funktion nicht

import multiprocessing 
pairs = [['a','b'],['c','d'],['e','f'],['g','h']] 

def printPairs(first, second): 
    print('pairs =', pairs) 

def parallel(function, pairs): 
    cpu_no = multiprocessing.cpu_count() 
    if len(pairs) < cpu_no: 
     cpu_no = len(pairs) 

    p = multiprocessing.Pool(cpu_no) 
    p.map_async(function, pairs, chunksize=1) 
    print('3, p = ', p) 
    p.close() 
    print('4') 
    p.join() 
    print('5')  
    return 

parallel(printPairs, pairs) 

Antwort

0

Make pairs ein Argument von printPairs:

import multiprocessing 


def printPairs(pairs): 
    print('pairs =', pairs) 

def parallel(function, pairs): 
    cpu_no = multiprocessing.cpu_count() 
    if len(pairs) < cpu_no: 
     cpu_no = len(pairs) 

    p = multiprocessing.Pool(cpu_no) 
    p.map_async(function, pairs, chunksize=1) 
    print('3, p = ', p) 
    p.close() 
    print('4') 
    p.join() 
    print('5') 
    return 

pairs = [['a','b'],['c','d'],['e','f'],['g','h']] 
parallel(printPairs, pairs) 

und es funktioniert.

Ausgang:

3, p = <multiprocessing.pool.Pool object at 0x10169d0f0> 
4 
pairs = ['c', 'd'] 
pairs = ['a', 'b'] 
pairs = ['e', 'f'] 
pairs = ['g', 'h'] 
5 
+0

Ich habe das auch versucht. Das ist wirklich seltsam, da es immer noch nicht in meinem Computer läuft. Es bleibt genau am selben Punkt hängen. – Yair

+0

Welche Python-Version und welches Betriebssystem? –

+0

Python 3.5.1 (mit Anaconda 4.0.0) auf einem Windows 10. – Yair

0

Ich vermute, dass auf Windows Sie die Funktion Ergebnisse erhalten müssen, auch wenn Sie sie nicht brauchen. Es scheint eine gute Idee zu sein, auch wenn es nicht notwendig ist.

import multiprocessing 
pairs = [['a','b'],['c','d'],['e','f'],['g','h']] 

def printPairs(pair): 
    print('pair =', pair) 

def parallel(function, pairs): 
    cpu_no = multiprocessing.cpu_count() 
    if len(pairs) < cpu_no: 
     cpu_no = len(pairs) 

    p = multiprocessing.Pool(cpu_no) 
    res = p.map_async(function, pairs, chunksize=1) 
    print('3, p = ', p) 
    print(res.get()) 
    print('4') 
    p.close() 
    print('5') 
    p.join() 
    print('6') 
    return 

if __name__ == '__main__': 
    parallel(printPairs, pairs) 
Verwandte Themen