Source code for dsw_document_template_tool._regression.parallel
"""Run baseline and candidate renders with isolated API clients."""
from __future__ import annotations
from collections.abc import Callable
from concurrent.futures import ThreadPoolExecutor
from ..api import DSWApiClient
from ..tdk import TemplateToolError
[docs]
def render_subjects_in_parallel(
*,
client: DSWApiClient,
baseline_render: Callable[[DSWApiClient], str],
candidate_render: Callable[[DSWApiClient], str],
) -> tuple[str, str]:
"""Render both subjects concurrently without sharing a requests session."""
def run_isolated(render: Callable[[DSWApiClient], str]) -> str:
render_client = clone_authenticated_client(client)
try:
return render(render_client)
finally:
render_client.close()
with ThreadPoolExecutor(max_workers=2, thread_name_prefix="dsw-render") as executor:
baseline_future = executor.submit(run_isolated, baseline_render)
candidate_future = executor.submit(run_isolated, candidate_render)
return baseline_future.result(), candidate_future.result()
[docs]
def clone_authenticated_client(client: DSWApiClient) -> DSWApiClient:
"""Clone API connection settings and bearer token for one render worker."""
if client.token is None:
raise TemplateToolError("Parallel render requires an authenticated DSW client")
render_client = DSWApiClient(
api_url=client.api_url,
verify_ssl=client.verify_ssl,
)
render_client.set_token(client.token)
return render_client