diff --git a/stdlib/@tests/test_cases/check_concurrent_futures.py b/stdlib/@tests/test_cases/check_concurrent_futures.py index 51a94b09d386..22af70277b9b 100644 --- a/stdlib/@tests/test_cases/check_concurrent_futures.py +++ b/stdlib/@tests/test_cases/check_concurrent_futures.py @@ -2,7 +2,7 @@ import sys from collections.abc import Callable, Iterator -from concurrent.futures import Future, ThreadPoolExecutor, as_completed +from concurrent.futures import Future, ProcessPoolExecutor, ThreadPoolExecutor, as_completed from typing import Literal from typing_extensions import assert_type @@ -32,6 +32,30 @@ def execute_callback(callback: Callable[[], Parent], future: Future[Parent]) -> assert isinstance(fut.result(), Child) +def _value_initializer(value: int) -> str: + return str(value) + + +def check_process_initializer(executor: ProcessPoolExecutor) -> None: + ProcessPoolExecutor(initializer=_value_initializer, initargs=(1,)) + ProcessPoolExecutor(initializer=_value_initializer, initargs=("x",)) # type: ignore + assert_type(executor._initializer, Callable[..., object] | None) + executor._initializer = _value_initializer + executor._initializer = None + executor._initializer = 1 # type: ignore + + +if sys.version_info < (3, 14): + + def check_thread_initializer(executor: ThreadPoolExecutor) -> None: + ThreadPoolExecutor(initializer=_value_initializer, initargs=(1,)) + ThreadPoolExecutor(initializer=_value_initializer, initargs=("x",)) # type: ignore + assert_type(executor._initializer, Callable[..., object] | None) + executor._initializer = _value_initializer + executor._initializer = None + executor._initializer = 1 # type: ignore + + if sys.version_info >= (3, 14): def _initializer(x: int) -> None: diff --git a/stdlib/concurrent/futures/process.pyi b/stdlib/concurrent/futures/process.pyi index 4dfe17afdc7f..da9a70849623 100644 --- a/stdlib/concurrent/futures/process.pyi +++ b/stdlib/concurrent/futures/process.pyi @@ -168,7 +168,7 @@ class BrokenProcessPool(BrokenExecutor): ... class ProcessPoolExecutor(Executor): _mp_context: BaseContext | None - _initializer: Callable[..., None] | None + _initializer: Callable[..., object] | None _initargs: tuple[Any, ...] _executor_manager_thread: _ThreadWakeup _processes: MutableMapping[int, Process] diff --git a/stdlib/concurrent/futures/thread.pyi b/stdlib/concurrent/futures/thread.pyi index 685bf1cfc104..457d952da683 100644 --- a/stdlib/concurrent/futures/thread.pyi +++ b/stdlib/concurrent/futures/thread.pyi @@ -97,7 +97,7 @@ class ThreadPoolExecutor(Executor): _create_worker_context: Callable[[], WorkerContext] _resolve_work_item_task: _ResolveTaskFunc else: - _initializer: Callable[..., None] | None + _initializer: Callable[..., object] | None _initargs: tuple[Any, ...] _work_queue: queue.SimpleQueue[_WorkItem[Any]]