Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
50 changes: 50 additions & 0 deletions continuous_integration/environment-3.14.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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
- 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
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