After Lifecycle is terminated (via SIGINT or a call to terminate), threads are left dangling, stuck in while True loops which will never complete.
Audit such loops (cursory examination suggests new_block_watch and _start_event_timer are the main culprits) and ensure they cleanly exit. Consider thread.joining them to make disposal more deterministic.
After
Lifecycleis terminated (via SIGINT or a call toterminate), threads are left dangling, stuck inwhile Trueloops which will never complete.Audit such loops (cursory examination suggests
new_block_watchand_start_event_timerare the main culprits) and ensure they cleanly exit. Considerthread.joining them to make disposal more deterministic.