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

arcAKTUELL 1.2014 - Wertvoll und begehrt

42 t ipps u nd t ric k s 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 mindestens 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-Skript (Worker) und übergibt die für den Job relevanten Argumente. Vor dem Start des Prozes- ses 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.communicate() 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-Implementierung „out of process“ zu ArcGIS (Skript-Tool- Eigenschaft), und der Worker ist als Funktion und nicht als eigenes Python-Skript implementiert. In diesem Fall wird für jeden Job ein Prozess definiert (multiprocessing.Process) mit den Angaben, welche Funktion mit welchen Argumen- ten ausgeführt werden soll. Eine Queue (multiprocessing.Queue) kann zur 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() TIPPS UND TRICKS Für Anwender

Seitenübersicht