diff --git a/scripts/sweep_led_placement.py b/scripts/sweep_led_placement.py index 1a62e27..24d7d46 100644 --- a/scripts/sweep_led_placement.py +++ b/scripts/sweep_led_placement.py @@ -743,16 +743,21 @@ return columns -def run_job(cond: Condition, scene_yaml: Path, record: dict) -> tuple[dict | None, list[str]]: +def run_job( + cond: Condition, scene_yaml: Path, record: dict, material: str = "legacy" +) -> tuple[dict | None, list[str]]: """1 条件をレンダ→評価まで実行し row.json を書いて集約行とログ行を返す. ワーカープロセスからも呼べるよう,引数・戻り値は pickle 可能なものだけにする (主プロセスの log クロージャは渡せないので,ログはメッセージとして返して - 主プロセスが書き出す). + 主プロセスが書き出す).材質はワーカー(spawn)に主プロセスの設定が伝わらないので + 引数で受け取り,ここで出力ディレクトリを切り替える. Returns: (集約行, ログ行のリスト).失敗した条件の集約行は None. """ + if material != _material: # 主プロセスや同一材質のワーカーでは出力先を触らない + set_material(material) messages: list[str] = [] out_dir = OUTPUT_BASE / cond.name row_json = out_dir / "row.json" @@ -875,7 +880,7 @@ context = multiprocessing.get_context("spawn") with ProcessPoolExecutor(max_workers=args.workers, mp_context=context) as pool: futures = { - pool.submit(run_job, cond, scene_yaml, geometry_record): cond + pool.submit(run_job, cond, scene_yaml, geometry_record, args.material): cond for cond, scene_yaml, geometry_record in jobs } for future in as_completed(futures): @@ -888,7 +893,7 @@ done += log_result(row, messages) else: for cond, scene_yaml, geometry_record in jobs: - done += log_result(*run_job(cond, scene_yaml, geometry_record)) + done += log_result(*run_job(cond, scene_yaml, geometry_record, args.material)) log(f"\n=== 完了: {done} / {len(prepared)} 条件 ===") log(f" 集約 CSV: {write_summary()}")