0
votes

Le fil de daemon Python sera-t-il bloqué par le fil parent occupé donné qu'il y a gil?

Je sais que le fil de Daemon Python sera la sortie automatique si la sortie du fil parent. La raison pour laquelle je demande si parce que mon fil principal est parfois opérationnel sur le calcul lourd de la CPU qui bloque le message de battement de coeur. D'autres module pensent que ce service est mort et planifie pour les funérailles.

Je veux utiliser une sorte de fil de démon (ou de processus?) C'est l'enfant du fil principal, d'envoyer un message de battement de coeur.

Ma question est si mon fil principal bloque, par exemple: xxx

mon fil d'enfant Daemon sera également bloqué? tout exemple ou preuve? Quel rôle joue Gil (Global Interprète Lock) ici?

edit

à @ Shawranger's Point, l'exemple suivant montre que le serveur peut vous déconnecter le message, étant donné que le fil du travailleur bloque (en prenant 220% Ressource du processeur) xxx


0 commentaires

3 Réponses :


2
votes

Si votre fil principal exécute le code d'octets Python (non incorporé dans un appel coûteux à long terme à un module d'extension C qui contient le GIL pour la longueur de l'appel et ne revient pas à l'interpréteur pendant une longue période), Ensuite, le fil de démon aura éventuellement une chance de courir; Le fil principal sera préempté après un moment (une matière de millisecondes) et le fil de démon fonctionnera pendant que le fil principal est bloqué. Tant que votre intervalle de battement de coeur est mesuré en quelques secondes, cela devrait être bien.

Un seul thread fonctionne réellement à un moment donné, mais les deux interlivent l'exécution.

Le scénario avec une tenue de gil à long terme par une extension peut arriver par accident, pour être clair; Toutes les extensions par défaut de détenir le gil. Bien que les extensions populaires, largement utilisées telles que Numpy soient prudentes de la libération de la gil quand ils ont suffisamment de travail à faire, des extensions écrites par des développeurs moins expérimentés (en particulier ceux qui écrivent à Cython sans connaissance de la gil ) Sont plus susceptibles de maintenir la gaine pendant de longues périodes, donc si votre battement de coeur n'est pas les modules de travail et d'extension sont impliqués, ils sont un coupable probable. Un simple tandis que TRUE: a = A + 1 boucle serait en sécurité (en supposant que a n'est pas un type de rallonge de cinglé); le gil peut être facilement commuté là-bas.


0 commentaires


0
votes

C'est probablement le rappel de la boucle IO à l'intérieur d'un fil qui bloque le battement de coeur. Comme @shadowranger souligne, le thread est entrelacé, qui ne doit pas bloquer un autre rappel périodique du fil (à l'exception de l'extension Python problématique). Dans mon cas, c'est probablement la file d'attente de l'ioloop Callback à l'intérieur du fil est le coupable. Pas d'entrelacement dans la file d'attente de rappel Ioloop.


0 commentaires