JuliaPy / JuliaPy/PythonCall.jl

Multithreading with PythonCall and PythonPlot leads to a EXCEPTION_ACCESS_VIOLATION

Aperta
#749 0 commenti 1 reazione 0 assegnatari Vedi su GitHub
bug
Lingua principale
Julia
Stelle
1.1k
Fork
86
Merge medio
1g 22h
PR unite (30g)
3

Descrizione

**Affects:** PythonCall

**Bug description**
Having both `PythonCall` and `PythonPlot` imported leads to a `EXCEPTION_ACCESS_VIOLATION` when used with multithreading with an unlocked GIL.

**MWE**
File: src\\Pythoncall_testing.jl
```
import PythonCall
import PythonPlot

PythonCall.GIL.@unlock Threads.@threads for i in 1:5
println("Hello world")
end
```

Commands

Command line:
```
C:\Users\kuhrmann\CODE\pythoncall_testing>julia -t 10
] activate .
include("src\\Pythoncall_testing.jl")
```

Output

```
C:\Users\kuhrmann\CODE\pythoncall_testing>julia -t 10
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.12.5 (2026-02-09)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org release
|__/ |

(@v1.12) pkg> activate .
Activating project at `C:\Users\kuhrmann\CODE\pythoncall_testing`

julia> include("src\\Pythoncall_testing.jl")
Hello world
Hello world
Hello world
Hello world
Hello world

Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.
Exception: EXCEPTION_ACCESS_VIOLATION at 0x7ffbe8a26c09 -- PyType_GenericAlloc at C:\Users\kuhrmann\CODE\pythoncall_testing\.CondaPkg\.pixi\envs\default\python314.dll (unknown line)
in expression starting at C:\Users\kuhrmann\CODE\pythoncall_testing\src\Pythoncall_testing.jl:4
PyType_GenericAlloc at C:\Users\kuhrmann\CODE\pythoncall_testing\.CondaPkg\.pixi\envs\default\python314.dll (unknown line)
PyUnicode_DecodeUTF8Stateful at C:\Users\kuhrmann\CODE\pythoncall_testing\.CondaPkg\.pixi\envs\default\python314.dll (unknown line)
PyUnicode_DecodeUTF8Stateful at C:\Users\kuhrmann\CODE\pythoncall_testing\.CondaPkg\.pixi\envs\default\python314.dll (unknown line)
PyUnicode_DecodeUTF8 at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\C\pointers.jl:300 [inlined]
pystr_fromUTF8 at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\builtins.jl:554
pystr_fromUTF8 at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\builtins.jl:555 [inlined]
pystr at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\builtins.jl:563 [inlined]
Py at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\Py.jl:125 [inlined]
macro expansion at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\Py.jl:117 [inlined]
pygetattr at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\builtins.jl:58
getproperty at C:\Users\kuhrmann\.julia\packages\PythonCall\83z4q\src\Core\Py.jl:275 [inlined]
#Tk_eventloop##0 at C:\Users\kuhrmann\.julia\packages\PythonPlot\oS8x4\src\pygui.jl:198
#634 at .\asyncevent.jl:361
unknown function (ip: 000001ead8510a6b) at (unknown file)
jl_apply at C:/workdir/src\julia.h:2391 [inlined]
start_task at C:/workdir/src\task.c:1252
Allocations: 3660481 (Pool: 3660333; Big: 148); GC: 5

C:\Users\kuhrmann\CODE\pythoncall_testing>
```

System info

**Your system**
Please provide detailed information about your system:
- The operating system: Win 11
- The version of Julia, Python, PythonCall, JuliaCall and any other affected packages
- If an issue with PythonCall, the output of `Base.versioninfo()`, `Pkg.status()` and `CondaPkg.status()`.

versioninfo()
```
Julia Version 1.12.5
Commit 5fe89b8ddc (2026-02-09 16:05 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: 20 × 13th Gen Intel(R) Core(TM) i7-1370P
WORD_SIZE: 64
LLVM: libLLVM-18.1.7 (ORCJIT, alderlake)
GC: Built with stock GC
Threads: 10 default, 1 interactive, 10 GC (on 20 virtual cores)
```

Pkg.status()
```
Project Pythoncall_testing v0.1.0
Status `C:\Users\kuhrmann\CODE\pythoncall_testing\Project.toml`
[6099a3de] PythonCall v0.9.31
[274fc56d] PythonPlot v1.0.6
```

CondaPkg.status()
```
CondaPkg Status C:\Users\kuhrmann\CODE\pythoncall_testing\CondaPkg.toml (empty)
Environment
C:\Users\kuhrmann\CODE\pythoncall_testing\.CondaPkg\.pixi\envs\default
```

**Additional context**
I dont want to use multithreading to plot on many threads, I just have a julia project in which I do multithreaded computation involving python, and the results of which I would like to plot with matplotlib.

From the stacktrace, it seems as though `PythonPlot.__init__()` gets called by each thread, which in turn calls python.
I belive this leads to a crash as the GIL is unlocked (`PythonCall.GIL@unlock`) but was not locked before the `PythonPlot.__init__()`.

This is quite frustrating, as I need both `PythonCall` and `PythonPlot` and I would like to not have to separate them at the project level.

Is there some way to avoid this? Perhaps I can somehow make sure the the `PythonPlot.__init__()` calls are wrapped with `PythonCall.GIL.@lock`?

Let me know if something is unclear!
Thanks for the convenient package otherwise!

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Start with src\\Pythoncall_testing.jl and reproduce the crash using Julia 1.12.5, PythonCall 0.9.31, PythonPlot 1.0.6, Windows, and 10 threads. Read the stack trace around PythonPlot's __init__ and pyGui.jl line 198, together with PythonCall.GIL.@unlock. Done means the interaction is understood and the reported access violation no longer occurs in the minimal example.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
julia, python
Ambito
backend
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.