2016-07-31 1 views
0

Actuellement, j'utilise python 3.4.3 et je développe l'application PyQt5.pickle.dump bloque le thread principal dans l'application python multithread à cause de GIL

Dans mon application, il y a un QThread, et un gros objet (100MB) est en train d'être déversé par le thread.

Cependant, le vidage de cet objet nécessite 1 ~ 2 secondes, et il bloque le thread principal environ 1 ~ 2 secondes à cause de GIL.

Comment puis-je résoudre ce problème (non-blocage du thread principal)?

Je pense que mon sérialisation objet à la chaîne prend du temps et il faut GIL, éventuellement bloque le thread principal. (Comme je sais, écrit fichier ne nécessite pas GIL)

Je pense à l'aide Cython, mais puisque je suis le débutant de Cython, je ne suis pas sûr que l'utilisation de Cython puisse résoudre ce problème.

Y a-t-il un moyen de contourner ce problème? Editer: J'ai essayé le module multiprocessing, mais le temps d'intercommunication (en passant les variables de mémoire partagée entre les processus) prend également environ 1 ~ 2 secondes, ce qui ne donne finalement aucun avantage.

+0

Est-il obligatoire que votre application soit multithread? Vous pouvez vous débarrasser de GIL si vous utilisez multiproccess à la place. –

+0

@RicardoSilveira J'ai essayé un module de multitraitement, mais cela prend aussi 1 ~ 2 secondes pour transmettre les variables de la mémoire partagée à travers les processus, ce qui ne donne finalement aucun avantage. J'aurais dû le mentionner dans ma question. – asqdf

+0

Peut-être [multiprocessing.sharedctypes] (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.sharedctypes) –

Répondre

1

J'ai résolu mon problème.

La solution a été

  1. Faire mon objet vraiment simple. Dans mon cas, j'ai converti mon objet en un tableau de dictionnaires simples et stringifiés.

  2. J'ai utilisé file.write(stringified_dictionaries) directement au lieu d'utiliser des cornichons. Cela a réduit le temps de sérialisation de l'objet python en chaîne.

Depuis E/S disque ne nécessite pas GIL en python, le seul thread principal bloqué instant était le moment de convertir mon objet, ce qui était vraiment court.