requested to merge pbatko/fix-missing-cleanup-when-run-without-pytest into master
(If you don't know what "daemon" means in threading context, stop here and learn about it first).
Problem was noticed during running script, which generates block log for tests in HAF (haf/tests/integration/local_tools/generate_block_log.py). When main thread was completed, cleanup was not triggered. So everything hung, because notification servers were still running.
I registered cleanup triggerring with
atexit package. It turned out, that
my handler are not run at the end of main thread. It will be run, when all
other non-daemon threads will be closed. But their never will, because closing
these servers were
I found solution in this great article: https://superfastpython.com/stop-daemon-thread/
Now main thread is the only one non-daemon thread. So when it ends, all other
threads will be closed. But before closing daemon threads Python will run our
atexit handler, and will politely wait, until handler will finish. So now
cleanup is run at the right moment and has time to perform.