modAL 1.2.3.dev1__tar.gz → 1.2.3.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/PKG-INFO +1 -1
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/async_utils.py +15 -5
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/client.pyi +2 -2
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api.proto +1 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api_pb2.py +619 -619
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api_pb2.pyi +4 -1
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_version/__init__.py +1 -1
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/LICENSE +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/README.md +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/__main__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_billing.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_clustered_functions.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_clustered_functions.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_container_entrypoint.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_functions.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_grpc_client.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_ipython.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_load_context.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_location.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_object.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_output.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_partial_function.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_pty.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_resolver.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_resources.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/asgi.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/execution_context.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/telemetry.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_serialization.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_traceback.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_tunnel.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_tunnel.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_type_manager.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/app_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/blob_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/deprecation.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/docker_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/function_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/git_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/hash_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/http_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/logger.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/mount_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/name_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/package_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/shell_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_utils/time_utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_vendor/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_vendor/tblib.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/_watcher.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/app.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/app.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/billing.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/2023.12.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/2024.04.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/2024.10.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/2025.06.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/README.md +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/builder/base-images.json +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/call_graph.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/_download.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/_traceback.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/app.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/cluster.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/config.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/container.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/dict.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/entry_point.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/environment.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/import_refs.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/launch.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/network_file_system.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/profile.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/programs/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/programs/vscode.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/queues.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/run.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/secret.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/token.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/utils.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cli/volume.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/client.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cls.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/cls.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/config.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/container_process.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/container_process.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/dict.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/dict.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/environments.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/environments.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/exception.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/experimental/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/experimental/flash.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/experimental/flash.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/experimental/ipython.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/file_io.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/file_io.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/file_pattern_matcher.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/functions.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/functions.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/gpu.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/image.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/image.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/io_streams.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/io_streams.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/mount.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/mount.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/network_file_system.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/network_file_system.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/object.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/object.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/output.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/parallel_map.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/parallel_map.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/partial_function.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/partial_function.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/proxy.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/proxy.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/py.typed +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/queue.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/queue.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/retries.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/runner.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/runner.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/running_app.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/sandbox.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/sandbox.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/schedule.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/scheduler_placement.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/secret.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/secret.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/serving.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/serving.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/snapshot.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/snapshot.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/stream_type.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/token_flow.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/token_flow.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/volume.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal/volume.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/requires.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal.egg-info/top_level.txt +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/__init__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/py.typed +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router.proto +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router.proto +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/modal_version/__main__.py +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/pyproject.toml +0 -0
- {modal-1.2.3.dev1 → modal-1.2.3.dev3}/setup.cfg +0 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# Copyright Modal Labs 2022
|
|
2
2
|
import asyncio
|
|
3
3
|
import concurrent.futures
|
|
4
|
+
import contextlib
|
|
4
5
|
import functools
|
|
5
6
|
import inspect
|
|
6
7
|
import itertools
|
|
7
8
|
import sys
|
|
8
9
|
import time
|
|
9
10
|
import typing
|
|
11
|
+
import warnings
|
|
10
12
|
from collections.abc import AsyncGenerator, AsyncIterable, Awaitable, Iterable, Iterator
|
|
11
13
|
from contextlib import asynccontextmanager
|
|
12
14
|
from dataclasses import dataclass
|
|
@@ -134,7 +136,8 @@ class TaskContext:
|
|
|
134
136
|
_loops: set[asyncio.Task]
|
|
135
137
|
|
|
136
138
|
def __init__(self, grace: Optional[float] = None):
|
|
137
|
-
self._grace = grace
|
|
139
|
+
self._grace = grace # grace is the time we want for tasks to finish before cancelling them
|
|
140
|
+
self._cancellation_grace: float = 1.0 # extra graceperiod for the cancellation itself to "bubble up"
|
|
138
141
|
self._loops = set()
|
|
139
142
|
|
|
140
143
|
async def start(self):
|
|
@@ -166,22 +169,29 @@ class TaskContext:
|
|
|
166
169
|
# still needs to be handled
|
|
167
170
|
# (https://stackoverflow.com/a/63356323/2475114)
|
|
168
171
|
if gather_future:
|
|
169
|
-
|
|
172
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
170
173
|
await gather_future
|
|
171
|
-
except asyncio.CancelledError:
|
|
172
|
-
pass
|
|
173
174
|
|
|
175
|
+
cancelled_tasks: list[asyncio.Task] = []
|
|
174
176
|
for task in self._tasks:
|
|
175
177
|
if task.done() and not task.cancelled():
|
|
176
178
|
# Raise any exceptions if they happened.
|
|
177
179
|
# Only tasks without a done_callback will still be present in self._tasks
|
|
178
180
|
task.result()
|
|
179
181
|
|
|
180
|
-
if task.done()
|
|
182
|
+
if task.done():
|
|
181
183
|
continue
|
|
182
184
|
|
|
183
185
|
# Cancel any remaining unfinished tasks.
|
|
184
186
|
task.cancel()
|
|
187
|
+
cancelled_tasks.append(task)
|
|
188
|
+
|
|
189
|
+
cancellation_gather = asyncio.gather(*cancelled_tasks, return_exceptions=True)
|
|
190
|
+
try:
|
|
191
|
+
await asyncio.wait_for(cancellation_gather, timeout=self._cancellation_grace)
|
|
192
|
+
except asyncio.TimeoutError:
|
|
193
|
+
warnings.warn(f"Internal warning: Tasks did not cancel in a timely manner: {cancelled_tasks}")
|
|
194
|
+
|
|
185
195
|
await asyncio.sleep(0) # wake up coroutines waiting for cancellations
|
|
186
196
|
|
|
187
197
|
async def __aexit__(self, exc_type, value, tb):
|
|
@@ -33,7 +33,7 @@ class _Client:
|
|
|
33
33
|
server_url: str,
|
|
34
34
|
client_type: int,
|
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
|
36
|
-
version: str = "1.2.3.
|
|
36
|
+
version: str = "1.2.3.dev3",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -164,7 +164,7 @@ class Client:
|
|
|
164
164
|
server_url: str,
|
|
165
165
|
client_type: int,
|
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
|
167
|
-
version: str = "1.2.3.
|
|
167
|
+
version: str = "1.2.3.dev3",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|