diff --git a/backtracepython/client.py b/backtracepython/client.py index 7d1b587..e034946 100644 --- a/backtracepython/client.py +++ b/backtracepython/client.py @@ -1,3 +1,4 @@ +import atexit import sys from backtracepython.attributes.attribute_manager import attribute_manager @@ -89,6 +90,7 @@ def initialize( context_line_count=200, collect_source_code=True, disable_global_handler=False, + exit_timeout=4, ): globs.endpoint = construct_submission_url(endpoint, token) globs.debug_backtrace = debug_backtrace @@ -102,6 +104,7 @@ def initialize( ignore_ssl_certificate, globs.debug_backtrace, ), + exit_timeout, ( SourceCodeHandler(tab_width, context_line_count) if collect_source_code @@ -113,6 +116,9 @@ def initialize( globs.next_except_hook = sys.excepthook sys.excepthook = bt_except_hook + if exit_timeout > 0: + atexit.register(finalize) + def construct_submission_url(endpoint, token): if "submit.backtrace.io" in endpoint or token is None: @@ -132,7 +138,8 @@ def construct_submission_url(endpoint, token): def finalize(): if globs.handler is None: return - globs.handler.dispose() + globs.handler.finish() + globs.handler = None def send_last_exception(**kwargs): diff --git a/backtracepython/report_queue.py b/backtracepython/report_queue.py index a42048d..a29201a 100644 --- a/backtracepython/report_queue.py +++ b/backtracepython/report_queue.py @@ -8,9 +8,10 @@ class ReportQueue: - def __init__(self, request_handler, source_code_handler=None): + def __init__(self, request_handler, exit_timeout, source_code_handler=None): self.request_handler = request_handler self.source_code_handler = source_code_handler + self.exit_timeout = exit_timeout # report submission tasks queue self.report_queue = queue.Queue() @@ -41,12 +42,8 @@ def process(self, report, attachments): self.source_code_handler.collect(report) self.request_handler.send(report, attachments) - def __del__(self): - self.dispose() - - def dispose(self): + def finish(self): # Put a sentinel value to stop the worker thread - self.active = False self.report_queue.put_nowait(None) - self.report_queue.join() - self.worker_thread.join() + self.worker_thread.join(timeout=self.exit_timeout) + self.active = False