Exécution de plusieurs threads - AWS Panorama

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécution de plusieurs threads

Vous pouvez exécuter la logique de votre application sur un thread de traitement et utiliser d'autres threads pour d'autres processus en arrière-plan. Par exemple, vous pouvez créer un threadsert le trafic HTTPpour le débogage, ou un thread qui surveille les résultats d'inférence et envoie des données àAWS.

Pour exécuter plusieurs threads, vous utilisez la commandeModule de threadsde la bibliothèque standard Python pour créer un thread pour chaque processus. L'exemple suivant montre la boucle principale de l'exemple d'application de serveur de débogage, qui crée un objet d'application et l'utilise pour exécutertroisthreads.

Exemple /Paquets/123456789012-debug_server-1.0/application.py— Boucle principale
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.')

Lorsque tous les threads se terminent, l'application redémarre d'elle-même. Lerun_cvLoop traite les images issues des flux de caméras. S'il reçoit un signal d'arrêt, il arrête le processus de débogage, qui exécute un serveur HTTP et ne peut pas s'arrêter lui-même. Chaque thread doit gérer ses propres erreurs. Si une erreur n'est pas détectée et enregistrée, le thread se ferme en mode silencieux.

Exemple /Paquets/123456789012-debug_server-1.0/application.py— Boucle de traitement
# 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")

Les threads communiquent via leselfObjet Pour redémarrer la boucle de traitement de l'application, le thread de débogage appelle lestopMéthode. Cette méthode définit unterminate, qui indique aux autres threads de s'arrêter.

Exemple /Paquets/123456789012-debug_server-1.0/application.py— Méthode Stop
# 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)