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 thread qui diffuse le trafic HTTP à des fins de 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 le module de threading
Exemple Packages/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 sont fermés, l'application redémarre d'elle-même. La run_cv
boucle 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 tout seul. Chaque thread doit gérer ses propres erreurs. Si aucune erreur n'est détectée et enregistrée, le thread se ferme silencieusement.
Exemple Packages/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 l'self
objet de l'application. Pour redémarrer la boucle de traitement de l'application, le thread du débogueur appelle la stop
méthode. Cette méthode définit un terminate
attribut qui indique aux autres threads de s'arrêter.
Exemple Packages/123456789012-debug_server-1.0/application.py — Méthode d'arrêt
# 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)