Ausführen mehrerer Threads - AWS Panorama

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ausführen mehrerer Threads

Sie können Ihre Anwendungslogik in einem Verarbeitungsthread ausführen und andere Threads für andere Hintergrundprozesse verwenden. Sie können beispielsweise einen Thread-Prinzip erstellen, derbedient HTTP-Datenverkehrzum Debuggen, oder ein Thread, der Inferenzergebnisse überwacht und Daten anAWSaus.

Um mehrere Threads auszuführen, verwenden Sie denThreading-Modulaus der Python-Standardbibliothek, um für jeden Prozess einen Thread zu erstellen. Das folgende Beispiel zeigt die Hauptschleife der Debugserver-Beispielanwendung, die ein Anwendungsobjekt erstellt und zum Ausführen verwendetdreiThreads.

Beispiel Pakete/123456789012-debug_server-1.0/application.py— Hauptschleife
def main(): panorama = panoramasdk.node() while True: try: # Instantiate application logger.info('INITIALIZING APPLICATION') app = Application(panorama) # Create threads for stream processing, debugger, and client app.run_thread = threading.Thread(target=app.run_cv) app.server_thread = threading.Thread(target=app.run_debugger) app.client_thread = threading.Thread(target=app.run_client) # Start threads logger.info('RUNNING APPLICATION') app.run_thread.start() logger.info('RUNNING SERVER') app.server_thread.start() logger.info('RUNNING CLIENT') app.client_thread.start() # Wait for threads to exit app.run_thread.join() app.server_thread.join() app.client_thread.join() logger.info('RESTARTING APPLICATION') except: logger.exception('Exception during processing loop.')

Wenn alle Threads beendet werden, startet die Anwendung von selbst neu. Dierun_cvloop verarbeitet Bilder aus Kamerastreams. Wenn es ein Signal zum Stoppen erhält, fährt es den Debugger-Prozess herunter, der einen HTTP-Server ausführt und sich nicht selbst herunterfahren kann. Jeder Thread muss seine eigenen Fehler behandeln. Wenn ein Fehler nicht abgefangen und protokolliert wird, wird der Thread im Hintergrund beendet.

Beispiel Pakete/123456789012-debug_server-1.0/application.py— Verarbeitungsschleife
# Processing loop def run_cv(self): """Run computer vision workflow in a loop.""" logger.info("PROCESSING STREAMS") while not self.terminate: try: self.process_streams() # turn off debug logging after 15 loops if logger.getEffectiveLevel() == logging.DEBUG and self.frame_num == 15: logger.setLevel(logging.INFO) except: logger.exception('Exception on processing thread.') # Stop signal received logger.info("SHUTTING DOWN SERVER") self.server.shutdown() self.server.server_close() logger.info("EXITING RUN THREAD")

Threads kommunizieren über dieself-Objekt. Um die Anwendungsverarbeitungsschleife neu zu starten, ruft der Debugger-Threadstop-Methode. Diese Methode setzt eineterminate-Attribut, das den anderen Threads signalisiert, herunterzufahren.

Beispiel Pakete/123456789012-debug_server-1.0/application.py— Stoppen -Methode
# Interrupt processing loop def stop(self): """Signal application to stop processing.""" logger.info("STOPPING APPLICATION") # Signal processes to stop self.terminate = True # HTTP debug server def run_debugger(self): """Process debug commands from local network.""" class ServerHandler(SimpleHTTPRequestHandler): # Store reference to application application = self # Get status def do_GET(self): """Process GET requests.""" logger.info('Get request to {}'.format(self.path)) if self.path == "/status": self.send_200('OK') else: self.send_error(400) # Restart application def do_POST(self): """Process POST requests.""" logger.info('Post request to {}'.format(self.path)) if self.path == '/restart': self.send_200('OK') ServerHandler.application.stop() else: self.send_error(400)