Freeze the resolved interpreter for child processes
メンテナーはふだん 2 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
src/C/context.jl から始め、子プロセスの起動時に getpref_exe と CTX.which が CondaPkg をどのように扱うかを追跡します。既存の CI によってゲートされた動作と preference の規約を確認し、その後、起動されたプロセスが CondaPkg を再解決することなく解決済みの実行可能ファイルを引き継ぐこと、またユーザーが設定した JULIA_PYTHONCALL_EXE が変更されないことを確認します。
索引モデルが issue の本文から書いたものです。
説明
When PythonCall resolves its interpreter via CondaPkg, each child process that loads
PythonCall re-resolves the same CondaPkg environment from scratch. Spawn several at once —
e.g. Distributed workers for parallel data loading (MLUtils DataLoader(...; num_workers=N)
over a PythonCall-backed dataset) — and they serialize on CondaPkg's lock, spamming
CondaPkg: Waiting for lock to be freed and redoing work the parent already did.
PythonCall already has the fix, but gates it behind CI=true and flags it as a hack
(src/C/context.jl, v0.9.35):
# HACK: If we are using CondaPkg, prevent child processes from using it by explicitly
# setting the executable. ...
# A better solution may be to use some environment variable to "freeze" CondaPkg in
# child processes.
# Only done when CI=true since it's a hack.
if (get(ENV, "CI", "false") == "true") && (CTX.which === :CondaPkg)
ENV["JULIA_PYTHONCALL_EXE"] = CTX.exe_path::String
end
Since JULIA_PYTHONCALL_EXE is exactly the "freeze" env var the comment asks for (child
processes inherit ENV, and getpref_exe reads it), the same line solves the general case.
Proposal
Set JULIA_PYTHONCALL_EXE whenever CTX.which === :CondaPkg, not only under CI — ideally
behind a preference (e.g. freeze_child_processes, default true) so it can be disabled.
get! already leaves a user-set value untouched.
Workaround
A downstream package can do this itself after init:
if PythonCall.C.CTX.which === :CondaPkg
get!(ENV, "JULIA_PYTHONCALL_EXE", PythonCall.python_executable_path()::String)
end
I've done this in https://github.com/JuliaGenAI/HuggingFaceDatasets.jl/pull/64
- 主要言語
- Julia
- スター
- 1.1k
- フォーク
- 88
- 平均マージ
- 3日 2時間
- マージ済み PR(30日)
- 6
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
JuliaPy/PythonCall.jl のほかの issue
-
難易度 3/5 1〜2日 初心者へのやさしさ 55/100
JuliaPy/PythonCall.jl#828 · コメント 7 件 ·
メンテナーはふだん 2 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
JuliaPy/PythonCall.jl#809 · コメント 2 件 ·
メンテナーはふだん 2 日以内に返信
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
JuliaPy/PythonCall.jl#805 · コメント 4 件 ·
メンテナーはふだん 2 日以内に返信
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
JuliaPy/PythonCall.jl#790 ·
メンテナーはふだん 2 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
JuliaPy/PythonCall.jl#765 · コメント 6 件 ·
メンテナーはふだん 2 日以内に返信
JuliaPy/PythonCall.jl の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
Sienna-Platform/PowerSystemCaseBuilder.jl#239 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
QuantumSavory/QuantumSavory.jl#592 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
JuliaQUBO/QUBOTools.jl#136 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
Sienna-Platform/PowerOperationsModels.jl#346 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
Sienna-Platform/PowerOpenAPIModels#39 ·
メンテナーはふだん 1 日以内に返信