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?
Wo sehen Sie machen tups in Tupel. Es scheint derzeit Alist zu sein –
Erhalten Sie nicht ein 'TypeError' bei' tups.append ("GO", Datasetlink) '? 'append' nimmt nur ein Argument. – Will
@Professor_Joykill OMG. Vielen Dank. Es gab mir keinen Fehler, wie Wilusdaman gefragt hatte, und deshalb habe ich das völlig übersehen. – pookie