imdecode jpeg2000 segfault or deadlock in multithreading
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 5.4k
- Forks
- 1k
- Merge moyen
- 22 h 17 min
- PR mergées (30 j)
- 3
Description
Expected behaviour
In the main thread, it works well as written in the example bellow:
import multiprocessing.pool
import cv2
import numpy as np
import tqdm
img = np.random.randint(0, 65335, (1024, 1024), dtype=np.uint16)
_, img_data = cv2.imencode(".jp2", img)
n = 100
def read(i):
image = cv2.imdecode(buffer, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_GRAYSCALE)
list(tqdm.tqdm(map(read, range(n)), total=n, desc="main thread main process"))
with multiprocessing.pool.Pool() as pool:
list(tqdm.tqdm(pool.imap_unordered(read, range(n)), total=n, desc="main thread child process"))
Actual behaviour
But in a thread, it is all broken!
import multiprocessing.pool
import cv2
import numpy as np
import tqdm
img = np.random.randint(0, 65335, (1024, 1024), dtype=np.uint16)
_, img_data = cv2.imencode(".jp2", img)
n = 100
def read(i):
image = cv2.imdecode(buffer, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_GRAYSCALE)
with multiprocessing.pool.ThreadPool() as pool:
list(tqdm.tqdm(pool.imap_unordered(read, range(n)), total=n, desc="child thread main process"))
When the code does not freeze by itself, an interrupt with ctrl+c leads allways to a segfault. Unlike the threadless example.
Steps to reproduce
- Tested on Debian, Ubuntu and Mint
- Version 4.9.0 of opencv-contrib-python-headless
- Tested on python 3.9, 3.10, 3.11 and 3.12
- architecture x86
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez avec le reproducteur Python ThreadPool fourni et comparez-le au cas multiprocessing Pool dans les environnements Python et basés sur Debian indiqués. Vérifiez la configuration du tampon et observez si le décodage JPEG2000 s’achève sans problème avec des threads concurrents ; cela est considéré comme terminé lorsqu’il n’y a ni deadlock ni segfault et que le décodage réussit lors des appels répétés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 42/100