2017-07-10 1 views
0

Ich probiere Multiprocessing in Python 3 aus und ich habe ein seltsames Verhalten (na ja, zumindest ist es seltsam für mich!).Python Multiprocessing mit Tupeln funktioniert nicht

Im Wesentlichen erstelle ich eine Liste von 10 Zufallszahlen. Ich schleife dann einen Bereich (in meinem Beispiel ist es 2) und für jede Iteration verwende ich pool.apply_async, um die Zufallszahlen parallel zu verarbeiten. Die Ergebnisse der "Verarbeitung" werden in einer Liste gespeichert, sodass nach Abschluss der Verarbeitung meine Ergebnisse gedruckt werden können. Ich erwarte 2 * 10 Ergebnisse.

Was finde ich jedoch, dass aus irgendeinem Grunde, ich sehe nur 2 Ergebnisse (dh die 2-Iterationen in meiner ersten Schleife):

import multiprocessing 
import time 
import random 

class Calculator: 

    def calculate(self, links): 
     print("LENGHT:", len(links)) # 48 
     tups=[] 
     for datasetlink in links: 
      print(datasetlink) 
      tups.append("GO", datasetlink) 
     return tups 

dslinks = random.sample(range(1, 101), 10) 
result_list = [] 

def Process(datasetlinks): 

    calc = Calculator(); 
    tups = calc.calculate(datasetlinks) 
    return tups; 

def log_result(result): 
    result_list.append(result) 

def apply_async_with_callback(): 
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) 
    for i in range(2): 
     pool.apply_async(Process, args = (dslinks,), callback = log_result) 
    pool.close() 
    pool.join() 
    DoPrintResults() 

def DoPrintResults(): 
    for result in result_list: 
     print(result) 

if __name__ == '__main__': 
    start = time.time() 
    apply_async_with_callback() 
    end = time.time() 
    print("Execution took: ", (end-start), " seconds") 

Wenn ich die tups=[], tups.append("GO", datasetlink) und return tups aus dem entfernen Calculator.calculate Funktion, alles funktioniert wie erwartet und ich sehe, dass die for-loop von Calculator.calculate 20 Mal getroffen wird.

Was mache ich falsch?

+0

Wo sehen Sie machen tups in Tupel. Es scheint derzeit Alist zu sein –

+0

Erhalten Sie nicht ein 'TypeError' bei' tups.append ("GO", Datasetlink) '? 'append' nimmt nur ein Argument. – Will

+0

@Professor_Joykill OMG. Vielen Dank. Es gab mir keinen Fehler, wie Wilusdaman gefragt hatte, und deshalb habe ich das völlig übersehen. – pookie

Antwort

0

Das Problem ist, diese Zeile:

tups.append("GO", datasetlink) 

Ändern Sie diesen an:

tups.append(datasetlink) 

Multi-Prozess-Code Debuggen kann tückisch sein. Eine Möglichkeit zum Debuggen ist das Verwenden von Ausnahmen. Setzen Sie alles in Process in einem try Block:

def Process(datasetlinks): 
    try: 
     calc = Calculator(); 
     tups = calc.calculate(datasetlinks) 
    except: 
     print(sys.exc_info()[0]) 
    return tups; 

Das gab mir <type 'exceptions.NameError'> und als ich den try-Block bewegt zu berechnen:

def calculate(self, links): 
    try: 
     print("LENGHT:", len(links)) # 48                  
     tups=[] 
     for datasetlink in links: 
      print(datasetlink) 
      tups.append("GO", datasetlink) 
    except: 
     print(sys.exc_info()[0]) 
    return tups 

Ich habe stattdessen <type 'exceptions.TypeError'>

+0

Danke. Darauf hat @Professor_Joykill hingewiesen und so konnte ich mein Problem beheben. Der Versuch/Fang ist auch eine gute Idee. Es warf mich, weil ich keine Fehler bekam. – pookie