Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,22 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
environment: [mindeps, "3.10", "3.11", "3.12", "3.13"]
environment: [mindeps, "3.10", "3.11", "3.12", "3.13", "3.14"]
label: [default]
extra_packages: [null]
# Cherry-pick test modules to split the overall runtime roughly in half
partition: [ci1, not ci1]

exclude:
# MacOS CI does not have any hosts available; run it on 3.12 only
# MacOS CI does not have many hosts available; run it on 3.14 only
- os: macos-latest
environment: mindeps
- os: macos-latest
environment: "3.10"
- os: macos-latest
environment: "3.11"
- os: macos-latest
environment: "3.12"
- os: macos-latest
environment: "3.13"

Expand Down
51 changes: 51 additions & 0 deletions continuous_integration/environment-3.14.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: dask-distributed-313
channels:
- conda-forge
dependencies:
- python=3.14
Copy link
Collaborator Author

@crusaderky crusaderky Dec 30, 2025

Choose a reason for hiding this comment

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

This file is identical to environment-3.13.yml, save for this line

- packaging
- pip
- asyncssh
- bokeh>3
- click
- cloudpickle
- coverage
- dask # overridden by git tip below
- fsspec # overridden by git tip below
# - gilknocker # conda-forge package not yet available for Python 3.14
- h5py
- ipykernel
- ipywidgets
- jinja2
- jupyter_events
- jupyter-server-proxy
- jupyterlab
- locket
- msgpack-python
- netcdf4
- paramiko
- pre-commit
- prometheus_client
- psutil
- pyarrow
- pytest
- pytest-cov
- pytest-faulthandler
- pytest-repeat
- pytest-rerunfailures
- pytest-timeout
- requests
- scikit-learn
- scipy
- sortedcollections
- tblib
- toolz
- tornado
- zict # overridden by git tip below
- zstandard
- pip:
- git+https://github.com/dask/dask
- git+https://github.com/dask/zict
- git+https://github.com/fsspec/filesystem_spec
- keras
- gilknocker # conda-forge package not yet available for Python 3.14
14 changes: 13 additions & 1 deletion distributed/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3250,8 +3250,20 @@ def _get_computation_code(
"|".join([f"(?:{mod})" for mod in ignore_modules])
)
if ignore_files:
# Given ignore-files = [foo], match:
# /path/to/foo
# /path/to/foo.py[c]
# /path/to/foo/bar.py[c]
# \path\to\foo
# \path\to\foo.py[c]
# \path\to\foo\bar.py[c]
# <frozen foo>
# Do not match files that have 'foo' as a substring,
# unless the user explicitly states '.*foo.*'.
ignore_files_or = "|".join(mod for mod in ignore_files)
fname_pattern = re.compile(
r".*[\\/](" + "|".join(mod for mod in ignore_files) + r")([\\/]|$)"
rf".*[\\/]({ignore_files_or})([\\/]|\.pyc?$|$)"
rf"|<frozen ({ignore_files_or})>$"
Comment on lines +3253 to +3266
Copy link
Collaborator Author

@crusaderky crusaderky Dec 31, 2025

Choose a reason for hiding this comment

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

runpy.py has been replaced by <frozen runpy> in Python 3.14

)
else:
# stacklevel 0 or less - shows dask internals which likely isn't helpful
Expand Down
3 changes: 2 additions & 1 deletion distributed/cluster_dump.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,8 @@ def to_yamls(
import yaml

root_dir = Path(root_dir) if root_dir else Path.cwd()
dumper = yaml.CSafeDumper
# libyaml C bindings may be missing
dumper = getattr(yaml, "CSafeDumper", yaml.SafeDumper)
Copy link
Collaborator Author

@crusaderky crusaderky Dec 31, 2025

Choose a reason for hiding this comment

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

They are missing in conda-forge for 3.14: conda-forge/pyyaml-feedstock#59

scheduler_expand_keys = set(scheduler_expand_keys)
worker_expand_keys = set(worker_expand_keys)

Expand Down
15 changes: 8 additions & 7 deletions distributed/distributed.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -289,14 +289,15 @@ distributed:
- __channelexec__ # more xdist
- execnet # more xdist
ignore-files:
- runpy\.py # `python -m pytest` (or other module) shell command
- pytest # `pytest` shell command
- py\.test # `py.test` shell command
- pytest-script\.py # `pytest` shell command in Windows
- _pytest # pytest implementation
# `python -m pytest` (or other module)
# runpy.py on Python <=3.13; <frozen runpy> on >=3.14
- runpy
# Many variations of pytest:
# pytest, py.test, pytest-script (on Windows),
# _pytest (implementation), vscode_pytest
- .*py\.?test.*
- pycharm # Run pytest from PyCharm GUI
- vscode_pytest
- get_output_via_markers\.py
- get_output_via_markers
erred-tasks:
max-history: 100

Expand Down
13 changes: 6 additions & 7 deletions distributed/protocol/tests/test_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,16 +162,15 @@ def test_sizeof_serialize(Wrapper, Wrapped):
@pytest.mark.skipif(WINDOWS, reason="On windows this is triggering a stackoverflow")
def test_deeply_nested_structures():
# These kind of deeply nested structures are generated in our profiling code
def gen_deeply_nested(depth, msg=None):
d = msg or {}
while depth:
depth -= 1
def gen_deeply_nested(depth):
d = {}
for _ in range(depth):
d = {"children": d}
return d

msg = {}
for _ in range(10):
msg = gen_deeply_nested(sys.getrecursionlimit() // 2, msg=msg)
# Note: Python <=3.13 already fails with 2x the recursion limit;
# 3.14 keeps working until much later (and the exact limit changes by platform)
msg = gen_deeply_nested(sys.getrecursionlimit() * 100)

with pytest.raises(RecursionError):
copy.deepcopy(msg)
Expand Down
3 changes: 1 addition & 2 deletions distributed/shuffle/tests/test_shuffle_plugins.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from __future__ import annotations

from asyncio import iscoroutinefunction

import pytest

from distributed.shuffle._scheduler_plugin import ShuffleSchedulerPlugin
from distributed.shuffle._worker_plugin import ShuffleWorkerPlugin
from distributed.utils import iscoroutinefunction
from distributed.utils_test import gen_cluster

pd = pytest.importorskip("pandas")
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ classifiers = [
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Scientific/Engineering",
"Topic :: System :: Distributed Computing",
]
Expand Down
Loading