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.
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? –
@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
Donc dans un tel cas, comme ci-dessus, l'utilisation du démon est-elle sûre? –