Please activate JavaScript!
Please install Adobe Flash Player, click here for download

arcAKTUELL 1.2013 - Leben in der Stadt

47T I P P S U N D T R I C K S 47 Die Thread-Strategie sieht vor, dass das Python-Script (Dispatcher) pro Job einen Thread startet. Sobald die Threads gestartet (multithreading. start_new_thread) wurden, läuft das Script durch eine while Schleife, bis sich alle Threads wieder zurückgemeldet haben (num_threads = 0): try: noOfThreads = multiprocessing.cpu_count() for i in range(int(noOfThreads)): thread.start_new_thread(start_ worker,([arguments])) except Exception as e: print e.args[0] return ## warten, bis mind. ein Thread gestartet wurde while not thread_started: pass ## warten, bis alle Threads beendet sind while num_threads > 0: pass Die Funktion start_worker übernimmt die Argumente für den Job und startet einen neuen Prozess. Dazu verwendet sie das zweite Python- Script (Worker) und übergibt die für den Job relevanten Argumente. Vor dem Start des Prozesses wird die globale Variable num_threads um 1 erhöht. Sobald der Prozess beendet ist, wird die Variable wieder um 1 verringert: def start_worker(arguments): global num_threads, thread_started num_threads += 1 thread_started = True try: pythonpath = „C:\\bin\\Python27\\ArcGIS10.1\\python.exe“ scriptname = os.path.join(os.path.abspath(os.path.dirname(__ file__)),“Worker.py“) commandline = [pythonpath, scriptname, arguments] rprocess = subprocess.Popen(commandline, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdoutstring, stderrstring = rprocess.communi- cate() if stdoutstring: arcpy.AddMessage(stdoutstring) if stderrstring: arcpy.AddError(stderrstring) except arcpy.ExecuteError: arcpy.AddError (arcpy.GetMessages(2)) except Exception as e: arcpy.AddError (e.args[0]) num_threads -= 1 Im Unterschied zur Thread-Strategie läuft die Multiprocess-Implemen- tierung „out-of-process“ zu ArcGIS (Skript-Tool-Eigenschaft) und der Worker ist als Funktion und nicht als eigenes Python-Skript implemen- tiert. In diesem Fall wird für jeden Job ein Prozess definiert (multiproces- sing.Process) – mit den Angaben, welche Funktion und mit welchen Ar- gumenten sie ausgeführt werden soll. Eine Queue (multiprocessing. Queue) kann als Kommunikation zwischen den Prozessen genutzt werden: number_of_processes = multiprocessing.cpu_count() processes = [] queues = [] for i in range(int(number_of_processes)): q = multiprocessing .Queue() p = multiprocessing .Process(target=worker, args=(q,)) p.start() processes.append(p) queues.append(q) ## warten, bis alle Prozesse beendet sind for p in processes: p.join() ## alle Queues auf Nachrichten hin abfragen for q in queues: arcpy.AddMessage(q.get()) Die Worker-Funktion nimmt die Queue und alle anderen Argumente für die Bearbeitung der ihr zugedachten Daten entgegen: def worker(q): try: env.overwriteOutput = True ## hier den Job implementieren ## ... q.put(„success“) except arcpy.ExecuteError: q.put(arcpy.GetMessages(2)) except Exception as e: q.put(e.args[0]) Diese beiden beschriebenen Szenarien setzen voraus, dass gezielt ein oder mehrere Jobs einem Prozess zugeordnet werden. Hat man viele einzelne Jobs und möchte es dem System überlassen, welcher Job durch welchen Prozess verarbeitet wird, ist die Multiprocessing.Pool- Strategie die zielführendste. Die Anzahl der abzuarbeitenden Jobs wird über eine Liste der Argumente definiert:

Seitenübersicht