diff --git a/src/ocrmypdf/_concurrent.py b/src/ocrmypdf/_concurrent.py index ab337e4d..60e8e45d 100644 --- a/src/ocrmypdf/_concurrent.py +++ b/src/ocrmypdf/_concurrent.py @@ -8,7 +8,7 @@ from __future__ import annotations import threading from abc import ABC, abstractmethod from collections.abc import Callable, Iterable -from typing import Any, TypeVar +from typing import Any, TypeVar, cast from ocrmypdf._progressbar import NullProgressBar, ProgressBar @@ -72,7 +72,10 @@ class Executor(ABC): if not task_finished: task_finished = _task_finished_noop if not task: - task = _task_noop + # _task_noop always returns None, but T is unbound here (it's + # only meaningful when a real task is supplied); task_finished's + # own no-op default accepts Any, so this is safe. + task = cast('Callable[..., T]', _task_noop) with self.pool_lock: self._execute( diff --git a/src/ocrmypdf/builtin_plugins/concurrency.py b/src/ocrmypdf/builtin_plugins/concurrency.py index b09213b4..a1fd8fde 100644 --- a/src/ocrmypdf/builtin_plugins/concurrency.py +++ b/src/ocrmypdf/builtin_plugins/concurrency.py @@ -27,9 +27,12 @@ from ocrmypdf.exceptions import InputFileError from ocrmypdf.helpers import remove_all_log_handlers if TYPE_CHECKING: + from logging import LogRecord from typing import TypeAlias - Queue: TypeAlias = multiprocessing.queues.Queue | queue.Queue + Queue: TypeAlias = ( + multiprocessing.queues.Queue[LogRecord | None] | queue.Queue[LogRecord | None] + ) UserInit: TypeAlias = Callable[[], None] WorkerInit: TypeAlias = Callable[[Queue, UserInit, int], None] @@ -99,7 +102,9 @@ def thread_init(q: Queue, user_init: UserInit, loglevel) -> None: return -def setup_executor(use_threads: bool) -> tuple[Queue, Executor, WorkerInit]: +def setup_executor( + use_threads: bool, +) -> tuple[Queue, FuturesExecutorClass, WorkerInit]: if not use_threads: # Some execution environments like AWS Lambda and Termux do not support # semaphores. Check if semaphore support is available, and if not, fall back @@ -112,6 +117,8 @@ def setup_executor(use_threads: bool) -> tuple[Queue, Executor, WorkerInit]: except ImportError: use_threads = True + loq_queue: Queue + executor_class: FuturesExecutorClass if use_threads: loq_queue = queue.Queue(-1) executor_class = ThreadPoolExecutor