Source code for eventtracking.locator

"""
Strategies for locating contexts.  Allows for arbitrarily complex caching
and context differentiation strategies.

All context locators must implement a `get` method that returns an
`OrderedDict`-like object.
"""


from collections import OrderedDict
import threading


[docs]class DefaultContextLocator: """ One-to-one mapping between contexts and trackers. Every tracker will get a new context instance and it will always be returned by this locator. """ def __init__(self): self.context = OrderedDict()
[docs] def get(self): """Get a reference to the context.""" return self.context
[docs]class ThreadLocalContextLocator: """ Returns a different context depending on the thread that the locator was called from. Thus, contexts can be isolated from one another on thread boundaries. Note that this makes use of `threading.local(),` which is typically monkey-patched by alternative python concurrency frameworks (like `gevent`). Calls to `threading.local()` are delayed until first usage in order to give the third-party concurrency libraries an opportunity to monkey monkey patch it. """ def __init__(self): self.thread_local_data = None
[docs] def get(self): """Return a reference to a thread-specific context""" if not self.thread_local_data: self.thread_local_data = threading.local() if not hasattr(self.thread_local_data, 'context'): self.thread_local_data.context = OrderedDict() return self.thread_local_data.context