翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
複数のスレッドの実行
アプリケーションロジックを処理スレッドで実行し、他のスレッドを他のバックグラウンドプロセスに使用することができます。たとえば、デバッグ用に HTTP トラフィックを処理するスレッドや、推論結果を監視してデータを AWS に送信するスレッドを作成できます。
複数のスレッドを実行するには、Python 標準ライブラリのスレッディングモジュール
例 packages/123456789012-DEBUG_SERVER-1.0/application.py — メインループ
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.')
すべてのスレッドが終了すると、アプリケーションは自動的に再起動します。run_cv
ループはカメラストリームからの画像を処理します。停止のシグナルを受け取ると、デバッガープロセスをシャットダウンします。デバッガープロセスは HTTP サーバーを実行していますが、それ自体をシャットダウンすることはできません。各スレッドは独自のエラーを処理する必要があります。エラーが捕捉されログに記録されない場合、スレッドは静かに終了します。
例 packages/123456789012-DEBUG_SERVER-1.0/application.py — 処理ループ
# 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")
スレッドはアプリケーションの self
オブジェクトを介して通信します。アプリケーション処理ループを再開するには、デバッガースレッドが stop
メソッドを呼び出します。このメソッドは、ほかのスレッドにシャットダウンを知らせるterminate
属性を設定します。
例 packages/123456789012-DEBUG_SERVER-1.0/application.py — 停止メソッド
# 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)