Hacker News new | ask | show | jobs
by OutOfHere 18 days ago
Does your code have a significant dependency on the version of Python? How easy will it be for you to maintain your code to support Python 3.15, 3.16, etc.? Is it too dependent on the implementation of Python 3.13 and 3.14 or its low level aspects? What is all the Python code doing?
1 comments

It depends on Python >= 3.13t, no-gil (so it can use real OS threads without locking.) It's been tested on 3.13t and 3.14t. As far as I know future versions of Python beyond that aren't planned for release for a number of years. But the extension code is fairly isolated. E.g. getting the extension to work on 3.14t from 3.13t took about 5 minutes. We're not reaching deep into the interpreter because the interface for extensions is well-defined already.

For the Python code you've really got 3 ways to use this extension:

1. You can use the main API. No monkey patching stuff. You use things like channels and the optimized serve API (this is what had the highest number in bench marks.) Here, you're using the projects APIs for networking.

2. Monkey patching. You use regular Python code inside the fibers. So you can write stuff like socket.socket ... and its patched to call runloom networking functions. You can see this points back to (1) but it has an overhead on top. You get to use libraries you're familiar with.

3. AIO bridge. This is to get asyncio code running on the scheduler. When you use the asyncio bridge it only uses a single thread. The main purpose of this is kind of like: "try out the project with your existing code." It also served the duel purpose of helping to find bugs in the runtime. Since I could reuse literally millions of test cases for the bridge.

tl; dr, (1) for a new project trying runloom -- learn the APIs. Or (2) if you mostly don't want to bother learning anything new / optimising anything. It might be a little slower but it will work. (3) you can mostly ignore. Unless you want to try asyncio code on it for the hell of it.

I propose separating #1 (the main API/SDK) into a separate core package. This will be easier, smaller, and cleaner to maintain, and will meet the needs of many users with new projects. It will satisfy the purity criteria.

I don't like the idea of monkeypatching even if it makes things convenient to use, because this risks being hell to maintain. You won't know of all the hidden bugs in it until a million users have used it.

As for the AIO bridge, single core execution is hell anyway, and so I don't like that idea either.

Can you point me to the documentation and examples of the main API/SDK?

great questions:

I'd say start here for some basics

https://github.com/robertsdotpm/runloom/blob/main/docs/quick...

https://github.com/robertsdotpm/runloom/blob/main/docs/cookb...

Then if you want the fastest performance possible for a server this is the epoll-based fastest benchmark program (it calls directly into an optimized server dispatcher built into the runtime. It's designed to minimize Python call overhead while still supporting handlers):

https://github.com/robertsdotpm/runloom/blob/main/benchmark/...

There's an equivalent of that for TCP connections too. UDP hasn't been added yet (optimized version.) And yes -- I have to admit that the API is a mess at the moment and so are the docs. This hasn't been designed well to be user-friendly (like 10 ways to do the same thing...) I just haven't had time to do it. All my time went into testing the project. And tuning performance. So you see a mix of different approaches. But this could be fixed fairly easily in the future.