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

ENH: Free-Threading (No-GIL) Support for Python 3.13+

Open HaoZeke opened this issue 7 months ago • 2 comments

As I see it (from a first look), the primary issue from a design perspective is to have all the Python threads synchronously access only one running scs instance. It is unclear if scs itself has any locking or design decisions around concurrency.

For the bindings here, it should mean introducing an instance-level lock within the SCS struct.

The standard TODOs for adding free-threading support are in two phases, the first of which is a baseline consisting of the following tasks:

  • [ ] Run the test suite with pytest-run-parallel to find potential issues, and fix them.
  • [ ] Run the test suite under ThreadSanitizer. If possible, depends on how many dependencies there are and if they run under TSan.
  • [ ] Add cp313t-* to CI to build free-threading wheels.

The next phase is a bit more invasive, and it involves a single task:

  • [ ] Audit Python bindings and declare them free-threading compatible (xref https://py-free-threading.github.io/porting/#updating-extension-modules).

For more details, please see the suggested plan of attack in the py-free-threading guide. The two phase approach is discussed in https://github.com/explosion/cymem/issues/47#issuecomment-2894478856 and https://github.com/gorakhargosh/watchdog/issues/1105#issuecomment-2888439578.

Note that this is the first time I've looked at this repo, so I might be missing known issues or code that needs closer inspection. Any suggestions here will be very useful.

Let me know if I ought to hold off for any reason.

HaoZeke avatar May 25 '25 21:05 HaoZeke

Initial thoughts..

uv venv --python 3.13t .ftci
source .ftci/bin/activate
uv pip install numpy scipy pytest-timeout pytest-durations pytest-run-parallel  
uv pip install -v .
uv run --no-project python -Xgil=0 -m pytest --parallel-threads=2 --iterations=2 -v -s --timeout=600 --durations=10 -m "not thread_unsafe"

has one failure

PARALLEL FAILED test/test_solve_random_cone_prob.py::test_solve_feasible[True-False] - AssertionError: 

Which goes away without --iterations.

HaoZeke avatar Jun 01 '25 10:06 HaoZeke

Yes, it would be great to enable this, thanks for taking a look!

bodono avatar Jun 13 '25 13:06 bodono