Skip to content

[Backport][v1.75.x][Python][Support 3.14] Enable 3.14 supported wheels#40726

Merged
sreenithi merged 1 commit intogrpc:v1.75.xfrom
sreenithi:backport-1.75-python_314_basictests_update
Sep 18, 2025
Merged

[Backport][v1.75.x][Python][Support 3.14] Enable 3.14 supported wheels#40726
sreenithi merged 1 commit intogrpc:v1.75.xfrom
sreenithi:backport-1.75-python_314_basictests_update

Conversation

@sreenithi
Copy link
Contributor

Backport of #40403 to v1.75.x.

This PR enables Python 3.14 in all the different tests - Basic tests (Native Python tests), Bazel tests and Distrib tests to build Python 3.14 artifacts. In addition, it also updates all the public facing METADATA versions.

Distribtests

Required pre-requisite changes to enable 3.14 artifacts are covered in #40289 .

Bazel tests

Enabling Python 3.14 required updating the rules_python version to a more recent version that supports 3.14. This was done in #40602

Basic tests

The following errors were caught by the Basic tests when running via Python 3.14 and resolved in this PR:

1) No running event loop for AsyncIO when run outside an async function

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi", line 184, in grpc._cython.cygrpc.get_working_loop
RuntimeError: no running event loop

This was caught by the tests_aio.unit.outside_init_test.TestOutsideInit and tests_aio.unit.init_test.TestInit tests, and was also previously reported in #39507 with the root cause.

Following some investigation, the fix is being worked on by @sergiitk in PR #40293. In order to parallelize the fix and this PR, these 2 tests are currently being skipped for Python 3.14 and above.

2) Pickling error from the multiprocessing library

_pickle.PicklingError: Can't pickle <function _test_well_known_types at 0x7f3937eee610>: it's not the same object as tests.unit._dynamic_stubs_test._test_well_known_types
when serializing dict item '_target'
when serializing multiprocessing.context.Process state
when serializing multiprocessing.context.Process object

This was caught by the tests.unit._dynamic_stubs_test.DynamicStubTest which runs test cases in a subprocess using the multiprocessing library.
Error root cause:

  • The default start method of multiprocessing in linux has changed to forkserver instead of fork from Python 3.14.
  • forkserver has a few extra restrictions for picklability as compared to fork (Ref: Python Docs)
  • All the test case functions in the DynamicStubTest that are provided as target to the multiprocessing.Process use decorators. This causes problems when pickling them.

Hence to resolve this, we manually set the 'start method' of multiprocessing to use the fork start method.

… tests (grpc#40403)

This PR enables Python 3.14 in all the different tests - Basic tests (Native Python tests), Bazel tests and Distrib tests to build Python 3.14 artifacts. In addition, it also updates all the public facing METADATA versions.
Required pre-requisite changes to enable 3.14 artifacts are covered in grpc#40289 .
Enabling Python 3.14 required updating the rules_python version to a more recent version that supports 3.14. This was done in grpc#40602
The following errors were caught by the Basic tests when running via Python 3.14 and resolved in this PR:
```
Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi", line 184, in grpc._cython.cygrpc.get_working_loop
RuntimeError: no running event loop
```
This was caught by the `tests_aio.unit.outside_init_test.TestOutsideInit` and `tests_aio.unit.init_test.TestInit` tests, and was also previously reported in grpc#39507 with the root cause.

Following some investigation, the fix is being worked on by @sergiitk  in PR grpc#40293. In order to parallelize the fix and this PR, these 2 tests are currently being skipped for Python 3.14 and above.
```
_pickle.PicklingError: Can't pickle <function _test_well_known_types at 0x7f3937eee610>: it's not the same object as tests.unit._dynamic_stubs_test._test_well_known_types
when serializing dict item '_target'
when serializing multiprocessing.context.Process state
when serializing multiprocessing.context.Process object
```
This was caught by the `tests.unit._dynamic_stubs_test.DynamicStubTest` which runs test cases in a subprocess using the `multiprocessing` library.
Error root cause:
- The default start method of multiprocessing in linux has changed to `forkserver` instead of `fork` from Python 3.14.
- `forkserver` has a few extra restrictions for picklability as compared to `fork` (Ref: [Python Docs](https://docs.python.org/3.14/library/multiprocessing.html#the-spawn-and-forkserver-start-methods))
- All the [test case functions](https://github.com/grpc/grpc/blob/0243842d5d10f624bf8f09f45026dd300805502f/src/python/grpcio_tests/tests/unit/_dynamic_stubs_test.py#L115) in the DynamicStubTest that are provided as `target` to the `multiprocessing.Process` use decorators. This causes problems when pickling them.

Hence to resolve this, we manually set the 'start method' of `multiprocessing` to use the `fork` start method.

Closes grpc#40403

PiperOrigin-RevId: 804290760
@sreenithi sreenithi self-assigned this Sep 17, 2025
@sreenithi sreenithi added the release notes: yes Indicates if PR needs to be in release notes label Sep 17, 2025
@sreenithi sreenithi marked this pull request as ready for review September 17, 2025 17:47
@sreenithi sreenithi requested a review from sergiitk as a code owner September 17, 2025 17:47
Copy link
Member

@sergiitk sergiitk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but please check why tests failed

@sreenithi
Copy link
Contributor Author

The Python test failure was a flaky one. The test passed on running a second time. The remaining 2 failures are also unrelated to our changes. So we should be good to merge.

@sreenithi sreenithi merged commit 74ec067 into grpc:v1.75.x Sep 18, 2025
58 of 60 checks passed
@sergiitk sergiitk added this to the Python 3.14 support milestone Sep 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants