0

Si le code suivant se trouve dans un thread démon et que le thread principal ne le fait pas, invoquez une jointure sur le démon. Le fichier se ferme-t-il en toute sécurité puisqu'il est utilisé à l'intérieur de "avec" une fois que le fil principal est sorti ou non? De toute façon pour le rendre sûr? Merci: DLes threads du démon Python et l'instruction "with"

while True: 
    with open('file.txt', 'r') as f: 
     cfg = f.readlines() 
time.sleep(60) 

Répondre

2

De l'docs:

Note: fils Daemon sont brusquement arrêtés à l'arrêt. Leurs ressources (telles que les fichiers ouverts, les transactions de base de données, etc.) peuvent ne pas être libérées correctement. Si vous voulez que vos threads s'arrêtent gracieusement, faites-les non-démoniaques et utilisez un mécanisme de signalisation approprié tel qu'un Event.

Cela suggère, mais ne dit pas purement et simplement, que les fils de démon est terminée sans chance de __exit__ méthodes et finally blocs pour exécuter. Nous pouvons exécuter une expérience pour vérifier que tel est le cas:

import contextlib 
import threading 
import time 

@contextlib.contextmanager 
def cm(): 
    try: 
     yield 
    finally: 
     print 'in __exit__' 

def f(): 
    with cm(): 
     print 'in with block' 
     event.set() 
     time.sleep(10) 

event = threading.Event() 

t = threading.Thread(target=f) 
t.daemon = True 
t.start() 

event.wait() 

où nous commençons un thread démon et le laisser dormir dans un with bloc lorsque les principaux sorties de fil. Quand nous run the experiment, nous obtenons une sortie de

in with block 

mais pas in __exit__, la méthode __exit__ obtient jamais une chance de courir.


Si vous voulez un nettoyage, n'utilisez pas de thread démon. Utilisez un fil régulier, et dites-lui de fermer à la fin du thread principal à travers les canaux de communication inter-thread réguliers.

+0

Merci pour cette réponse rapide. Donc essentiellement en fonction de ma question le fichier est laissé ouvert en mode lecture? Une question de suivi - est-ce que cela rend le fichier inutilisable? –

+0

@SamThomas: Le système d'exploitation doit automatiquement fermer les poignées de fichier ouvertes du processus au niveau du système d'exploitation lorsque le processus se termine, mais cela ne fera pas nécessairement des choses comme vider les tampons de sortie pour les fichiers ouverts en écriture. – user2357112

+0

Donc dans un tel cas, comme ci-dessus, l'utilisation du démon est-elle sûre? –