Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Multithreading with PythonCall and PythonPlot leads to a EXCEPTION_ACCESS_VIOLATION

Aberta
#749 0 comentários 1 reação 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
julia, python
Domínio
backend

Direção de pesquisa

Comece com src\Pythoncall_testing.jl e reproduza o crash usando Julia 1.12.5, PythonCall 0.9.31, PythonPlot 1.0.6, Windows e 10 threads. Leia o stack trace em torno de init do PythonPlot e da linha 198 de pyGui.jl, junto com PythonCall.GIL.@unlock. A tarefa estará concluída quando a interação estiver compreendida e a violação de acesso relatada não ocorrer mais no exemplo mínimo.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug

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!

Linguagem predominante
Julia
Estrelas
1.1k
Forks
89
Merge médio
2d 15h
PRs com merge (30d)
7

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de JuliaPy/PythonCall.jl

Todas as issues de JuliaPy/PythonCall.jl

Issues semelhantes

Mais issues de Julia

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.