this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: add proper shutdown sequence

+41 -2
+41 -2
src/camera_server.py
··· 171 171 except Exception as e: 172 172 logger.error(f"Server error: {str(e)}") 173 173 174 + def cleanup(): 175 + try: 176 + # Instead of getting/creating a new loop, we'll work with the running loop 177 + loop = asyncio.get_running_loop() 178 + 179 + # Create a new event loop for cleanup operations if needed 180 + cleanup_loop = asyncio.new_event_loop() 181 + asyncio.set_event_loop(cleanup_loop) 182 + 183 + # Close all websocket connections 184 + for websocket in connected_clients.copy(): 185 + cleanup_loop.run_until_complete(websocket.close()) 186 + 187 + # Cancel all tasks in the main loop 188 + for task in asyncio.all_tasks(loop): 189 + task.cancel() 190 + 191 + cleanup_loop.close() 192 + 193 + except RuntimeError: 194 + # Handle case where there is no running loop 195 + logger.info("No running event loop found during cleanup") 196 + except Exception as e: 197 + logger.error(f"Error during cleanup: {str(e)}") 198 + 174 199 def main(): 175 200 logger.info("Camera and web server starting") 176 201 server = None 202 + ws_server = None 203 + loop = None 177 204 178 205 try: 206 + socketserver.TCPServer.allow_reuse_port = True 207 + 179 208 # Start HTTP server 180 209 server = socketserver.TCPServer(("", Config.WEB_PORT), PhotoHandler) 181 210 server_thread = threading.Thread(target=server.serve_forever, daemon=True) 182 211 server_thread.start() 212 + 213 + # Create new event loop for websockets 214 + loop = asyncio.new_event_loop() 215 + asyncio.set_event_loop(loop) 183 216 184 217 # Start WebSocket server 185 218 ws_server = websockets.serve(websocket_handler, "0.0.0.0", Config.WS_PORT) 186 - asyncio.get_event_loop().run_until_complete(ws_server) 219 + loop.run_until_complete(ws_server) 187 220 ws_thread = threading.Thread( 188 - target=asyncio.get_event_loop().run_forever, 221 + target=loop.run_forever, 189 222 daemon=True 190 223 ) 191 224 ws_thread.start() 225 + 226 + logger.info("Camera and web server started") 192 227 193 228 previous_state = GPIO.input(Config.BUTTON_PIN) 194 229 while True: ··· 210 245 if server: 211 246 server.shutdown() 212 247 server.server_close() 248 + if loop: 249 + loop.stop() 213 250 GPIO.cleanup() 214 251 logger.info("GPIO cleaned up") 252 + cleanup() 253 + time.sleep(0.5) 215 254 216 255 if __name__ == "__main__": 217 256 main()