mixpanel / mixpanel-python

Official Mixpanel Python library.
https://mixpanel.com/help/reference/python
Other
103 stars 85 forks source link

Async support #106

Open ramnes opened 2 years ago

ramnes commented 2 years ago

Hey there, thanks for the neat library.

Do you have any plan to support native async features of Python?

e.g.:


from mixpanel import AsyncMixpanel

mp = AsyncMixpanel(YOUR_TOKEN)

# tracks an event with certain properties
await mp.track(DISTINCT_ID, 'button clicked', {'color' : 'blue', 'size': 'large'})

# sends an update to a user profile
await mp.people_set(DISTINCT_ID, {'$first_name' : 'Ilya', 'favorite pizza': 'margherita'})
seizethedave commented 2 years ago

Hello @ramnes - no, I haven't spent any time thinking about that. It sounds useful as an alternative backend, and if you end up with ideas about how this might look, I'd be happy to work with you on it. As it stands, the test suite for this project is heavily tied to requests which I understand would not be used under an async variant of this library/class. I do have plans to open the design up a bit in the next major version to allow more flexibility - perhaps an async mode could influence that a bit.

ramnes commented 2 years ago

Yep, I've seen that you switched to requests recently. That's a missed opportunity because supporting async definitely means using another library. Ideally you want to use a single library for both the sync and async HTTP requests, like encode/httpx.

The codebase here is quite small and I've written multiple sync/async HTTP clients already (most notably notion-sdk-py); I could probably tackle this myself someday if you're interested in such a PR. Are you?

seizethedave commented 2 years ago

@ramnes Let's come back to this once we've nixed Py2 support. Next major vers., which is cooking slowly.

ramnes commented 2 years ago

What's the roadmap exactly? I could bring Python 3 idiomatic features as well if you wish. Is there anything in particular that you want to achieve before?

DimaDDM commented 1 year ago

Hello. I will support this issue. i want to see async support for this library. I have been using it for many years and in connection with the transfer of projects to the asynchronous stack it would be very appreciated

Kylmakalle commented 1 year ago

I've forked the repo and re-implemented it with aiohttp https://github.com/Kylmakalle/mixpanel-python-asyncio. Available for Python 3.7+.

I've rewritten the tests to asyncio as well, so It should be safe enough to install.

Release 1.0.0

Install

pip install https://github.com/Kylmakalle/mixpanel-python-asyncio/archive/1.0.0.zip

Code

from mixpanel_asyncio import Mixpanel

mp = Mixpanel(YOUR_TOKEN)

# tracks an event with certain properties
await mp.track(DISTINCT_ID, 'button clicked', {'color' : 'blue', 'size': 'large'})

# sends an update to a user profile
await mp.people_set(DISTINCT_ID, {'$first_name' : 'Ilya', 'favorite pizza': 'margherita'})
MrEarle commented 11 months ago

I believe this is an important improvement. Since requests is sync, it blocks the event loop while waiting for a response.

This can impact frameworks such as FastAPI (or other asyncio based http frameworks). Blocking the event loop would make it so that the worker might not be able to process a request.