[ 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)