mixpanel-python icon indicating copy to clipboard operation
mixpanel-python copied to clipboard

Async support

Open ramnes opened this issue 2 years ago • 7 comments

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'})

ramnes avatar Nov 12 '21 21:11 ramnes

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.

seizethedave avatar Nov 16 '21 17:11 seizethedave

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?

ramnes avatar Nov 16 '21 19:11 ramnes

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

seizethedave avatar Nov 17 '21 22:11 seizethedave

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?

ramnes avatar Nov 20 '21 13:11 ramnes

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

DimaDDM avatar Jan 26 '23 15:01 DimaDDM

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'})

Kylmakalle avatar Apr 26 '23 20:04 Kylmakalle

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.

MrEarle avatar Dec 05 '23 18:12 MrEarle