This library allows for using the Mixpanel python client in an asynchronous way. Using the AsyncBufferedConsumer, events sent to the Mixpanel API will be batched and then flushed in a thread without blocking the main thread. This is extremely useful in a request/response scenario where response time is important.
This library was originally created for use at Clef and is in production use there.
The library can be installed using pip:
pip install mixpanel-py-async
Typical usage usually looks like this:
#!/usr/bin/env python
from mixpanel import Mixpanel
from mixpanel_async import AsyncBufferedConsumer
mp = Mixpanel(YOUR_TOKEN, consumer=AsyncBufferedConsumer())
# tracks an event with certain properties
mp.track('distinct_id', 'event name', {'color' : 'blue', 'size': 'large'})
# sends an update to a user profile
mp.people_set(USER_ID, {'$first_name' : 'Amy', 'favorite color': 'red'})
These events will be batched and then sent in a seperate, asynchronous thread.
For most users, the default configuration should work perfectly. For more specific needs, AsyncBufferedConsumer has a variety of configuration options, which you can use to manage how it batches and sends API requests.
flush_after (datetime.timedelta)
- defaults to 10 seconds - the time period after which the AsyncBufferedConsumer will flush the events upon receiving a new event (no matter what the event queue size is)flush_first (bool)
- defaults to True - whether the consumer should always flush the first event.max_size (int)
- defaults to 20 - how big a given event queue can get before it is flushed by the consumerevents_url (str)
- defaults to standard Mixpanel API URL - the Mixpanel API URL that track events will be sent topeople_url (str)
- defaults to standard Mixpanel API URL - the Mixpanel API URL that people events will be sent toimport_url (str)
- defaults to standard Mixpanel API URL - the Mixpanel API URL that import events will be sent torequest_timeout (int)
- defaults to None
(no timeout) - Connection timeout in seconds.groups_url (str)
- defaults to standard Mixpanel API URL - the Mixpanel API URL that groups events will be sent toapi_host (str)
- defaults to api.mixpanel.com - Mixpanel API domain for all requests unless overridden by above URLsretry_limit (int)
- defaults to 4 - Number of times to retry each request in case of an error, 0 to fail after first attempt.retry_backoff_factor
- defaults to 0.25 - Factor which controls sleep duration between retries: sleep_seconds = backoff_factor * (2 ^ (retry_count - 1))
verify_cert
- defaults to True
- Whether to verify the server certificate. True
is recommended.Typically, after configuring the AsyncBufferedConsumer and passing it to the Mixpanel object, you will never have to use it again. That said, there are a few methods which can be useful.
flush()
- tells the AsyncBufferedConsumer to flush all of the events in its queues. If you call it with async_=False
this flush will happen in the main thread (useful for ensuring all events are sent before a process ends)#!/usr/bin/env python
from mixpanel import Mixpanel
from mixpanel_async import AsyncBufferedConsumer
consumer = AsyncBufferedConsumer()
mp = Mixpanel(YOUR_TOKEN, consumer=consumer)
# tracks an event with certain properties
mp.track('distinct_id', 'event name', {'color' : 'blue', 'size': 'large'})
consumer.flush(async_=False)
# all events are flushed and process ends
If you find an issue, let us know in the issues section!
From the Rubinius contribution page:
Writing code and participating should be fun, not an exercise in perseverance. Stringent commit polices, for whatever their other qualities may bring, also mean longer turnaround times.
Submit a patch and once it's accepted, you'll get commit access to the repository. Feel free to fork the repository and send a pull request, once it's merged in you'll get added. If not, feel free to bug jessepollak about it.
git@github.com:jessepollak/mixpanel-python-async.git
git checkout -b awesome_feature
git fetch && git rebase origin/master
.python setup.py test
Once you're ready:
git remote add your_remote your_repo
git push your_remote awesome_feature
Once it's accepted:
git remote set-url origin git@github.com:jessepollak/mixpanel-python-async.git
Otherwise, you can continue to hack away in your own fork.
thanks to rubygems for inspiration of our guidelines