perf: reuse event loop in BatchSpanProcessor instead of creating one per export #45
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
BatchSpanProcessorpreviously calledasyncio.new_event_loop()for every batch export when using async adapters. Creating and destroying event loops is expensive (involves allocating selectors, registering file descriptors, and other OS-level setup/teardown) and can show up as latency/jitter under load. This change creates a single long-lived event loop when the export thread starts and reuses it for all async exports.Changes
_thread_loopinstance variable to store the long-lived event loop_export_loop()instead of per-export_export_batch()for async adapter exportsfinallyblock when the export thread exits_force_flush()after shutdown (rare, one-time occurrence when the thread has already exited)tests/unit/test_batch_processor.py