Ich 'lerne' mich langsam ran.
Mit multiprocessing konnte ich nun in einem Testcase tatsächlich zeit einsparen. Ich habe Child-Processe mit einem sleep=5. Führe ich alle Combinations von 2 aus 4 Elementen aus (=6), dauert mein Skript 30s. Mit 6 Child-Prozessen nur noch 5. Wahnsinn!
Wichtig: ich musste mit den print's in den Child-Prozessen experimentieren, da print mit Buffern arbeitet. Flushen hat nichts gebracht, also arbeite ich mit multiprocessing.block.
Zusätzlich werde ich die chunksize verwenden, damit bei 60.000.000 Iterationen nicht fast 60.000.000 Prozesse in memory warten müssen.
Code: Alles auswählen
from itertools import combinations
import multiprocessing
import os
import sys
import time
# timer
from datetime import datetime
start_time = datetime.now()
def process_index(index):
# hier werden alle Operationen auf EINER Kombination durchgeführt
time.sleep(5)
with lock:
print("I am a running Worker processing: ", list(index), " with PID: ", os.getpid())
if __name__ == "__main__":
result = combinations(range(4), 2)
# all elemnts: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
lock = multiprocessing.Lock()
num_processes = 6
with multiprocessing.Pool(processes=num_processes) as pool:
pool.map(process_index, result, chunksize=1)
pool.close()
pool.join()
# print time taken
print("----------------\ndatetime: ", datetime.now() - start_time)
Output:
Code: Alles auswählen
I am a running Worker processing: [0, 1] with PID: 14485
I am a running Worker processing: [0, 2] with PID: 14486
I am a running Worker processing: [0, 3] with PID: 14487
I am a running Worker processing: [1, 2] with PID: 14488
I am a running Worker processing: [2, 3] with PID: 14491
I am a running Worker processing: [1, 3] with PID: 14489
----------------
datetime: 0:00:05.154608
Mal sehen wie das mit meinen echten Daten laufen wird....