You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Lysandros Nikolaou (Jira)" <ji...@apache.org> on 2025/07/25 13:17:00 UTC

[jira] [Commented] (THRIFT-5888) declare support for free-threaded CPython in extension modules

    [ https://issues.apache.org/jira/browse/THRIFT-5888?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18009946#comment-18009946 ] 

Lysandros Nikolaou commented on THRIFT-5888:
--------------------------------------------

I did an auditing of the thrift extension module and it does not appear to have any global state or rely on the GIL for serialized access to shared objects. I also ran the tests with the GIL disabled and didn't find any issues, while also doing a stress-test of some of the tests that do not exercise threaded access currently by running them 20 times in 10 threads in parallel. All looks good.

I've opened a PR to avoid reenabling the GIL when importing `thrift.protocol.fastbinary` at https://github.com/apache/thrift/pull/3180.

> declare support for free-threaded CPython in extension modules
> --------------------------------------------------------------
>
>                 Key: THRIFT-5888
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5888
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Python - Library
>    Affects Versions: 0.22.0
>         Environment: MacOS 15.5, thrift commit 9cff8b9f5b217c143c75299939c32573ccd4c9c3, Python 3.13.5t built using PyEnv.
>            Reporter: Nathan Goldbaum
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> Currently thrift's extensions do not declare support for the free-threaded build, so if you import them on the free-threaded build you will see a RuntimeWarning:
>  
> {code}
> >>> import thrift.protocol.fastbinary
> <frozen importlib._bootstrap>:488: RuntimeWarning: The global interpreter lock (GIL) has been enabled to load module 'thrift.protocol.fastbinary', which has not declared that it can run safely without the GIL. To override this behavior and keep the GIL disabled (at your own risk), run with PYTHON_GIL=0 or -Xgil=0.
> {code}
> If I force-disable the GIL on a free-threaded Python 3.15.5t on my Mac, I don't see any test failures running the Python tests:
> {code}
> goldbaum at Nathans-MBP in ~/Documents/thrift/lib/py on master!
> ± PYTHON_GIL=0 make py3-test
> /Users/goldbaum/.pyenv/shims/python setup.py build
> running build
> running build_py
> copying src/__init__.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/TRecursive.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/TTornado.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/TMultiplexedProcessor.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/Thrift.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/TSCons.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/TSerialization.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift
> copying src/protocol/TProtocolDecorator.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/THeaderProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TJSONProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TMultiplexedProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/__init__.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TBinaryProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TBase.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TCompactProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/protocol/TProtocol.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/protocol
> copying src/transport/TTransport.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/TTwisted.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/TSSLSocket.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/__init__.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/THeaderTransport.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/TSocket.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/sslcompat.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/THttpClient.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/transport/TZlibTransport.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/transport
> copying src/server/__init__.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/server
> copying src/server/TServer.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/server
> copying src/server/TProcessPoolServer.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/server
> copying src/server/THttpServer.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/server
> copying src/server/TNonblockingServer.py -> build/lib.macosx-15.5-arm64-cpython-313t/thrift/server
> running build_ext
> /Users/goldbaum/.pyenv/shims/python test/thrift_json.py
> ...
> ----------------------------------------------------------------------
> Ran 3 tests in 0.000s
> OK
> /Users/goldbaum/.pyenv/shims/python test/thrift_transport.py
> ...
> ----------------------------------------------------------------------
> Ran 3 tests in 0.001s
> OK
> /Users/goldbaum/.pyenv/shims/python test/test_sslsocket.py
> .sssssssssss
> ----------------------------------------------------------------------
> Ran 12 tests in 0.000s
> OK (skipped=11)
> /Users/goldbaum/.pyenv/shims/python test/thrift_TBinaryProtocol.py
> ..
> ----------------------------------------------------------------------
> Ran 2 tests in 0.002s
> OK
> /Users/goldbaum/.pyenv/shims/python test/thrift_TZlibTransport.py
> ..
> ----------------------------------------------------------------------
> Ran 2 tests in 1.261s
> OK
> /Users/goldbaum/.pyenv/shims/python test/thrift_TCompactProtocol.py
> .
> ----------------------------------------------------------------------
> Ran 1 test in 0.003s
> OK
> /Users/goldbaum/.pyenv/shims/python test/thrift_TNonblockingServer.py
> -------start server ------
> /Users/goldbaum/.pyenv/versions/3.13.5t/lib/python3.13t/threading.py:994: ResourceWarning: unclosed <socket.socket fd=6, family=2, type=1, proto=0, laddr=('127.0.0.1', 63805), raddr=('127.0.0.1', 30030)>
>   self._target(*self._args, **self._kwargs)
> ResourceWarning: Enable tracemalloc to get the object allocation traceback
> ------stop server -----
> /Users/goldbaum/.pyenv/versions/3.13.5t/lib/python3.13t/unittest/case.py:606: ResourceWarning: unclosed <socket.socket fd=3, family=1, type=1, proto=0>
>   if method() is not None:
> ResourceWarning: Enable tracemalloc to get the object allocation traceback
> /Users/goldbaum/.pyenv/versions/3.13.5t/lib/python3.13t/unittest/case.py:606: ResourceWarning: unclosed <socket.socket fd=4, family=1, type=1, proto=0>
>   if method() is not None:
> ResourceWarning: Enable tracemalloc to get the object allocation traceback
> .
> ----------------------------------------------------------------------
> Ran 1 test in 10.022s
> OK
> /Users/goldbaum/.pyenv/shims/python test/thrift_TSerializer.py
> ....
> ----------------------------------------------------------------------
> Ran 4 tests in 0.001s
> OK
> {code}
> And it looks like the tests do rely on python threads, so this should be usefully testing concurrent behavior on the free-threaded build.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)