JuliaPy / JuliaPy/PythonCall.jl

Freeze the resolved interpreter for child processes

Đang mở
#796 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
enhancement
Ngôn ngữ chính
Julia
Star
1.1k
Fork
86
Merge trung bình
1 ngày 22 giờ
Pull request đã merge (30 ngày)
3

Mô tả

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):

```julia
# 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:

```julia
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

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Start in src/C/context.jl and trace how getpref_exe and CTX.which handle CondaPkg during child-process startup. Verify the existing CI-gated behavior and preference conventions, then confirm that spawned processes inherit the resolved executable without re-resolving CondaPkg and that a user-set JULIA_PYTHONCALL_EXE remains unchanged.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
backend
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
68/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.