2017-09-14 4 views
0

J'essaie d'utiliser un fichier (csv, json, txt, format non décidé) dans lequel je peux laisser tomber quelques lignes de données. Un script python sera lancé sur cron toutes les 5 minutes et vérifiez le fichier s'il y a quelque chose de nouveau et s'il y en a, traitez-le et supprimez chaque ligne au fur et à mesure de son traitement.Modifier le fichier en cours de traitement par le script python

J'essaie d'éviter une situation où j'ouvre le fichier, faire quelques changements et l'enregistrer alors que le processus est venu a saisi les données et vidé le fichier, mais mon sauver l'écrit avant.

Je pensais que le Le seul moyen de sécuriser ce processus est de le faire traiter dans un dossier et de rechercher de nouveaux fichiers, toutes les modifications seront supprimées dans un nouveau fichier. Il n'y a donc jamais de risque que cela se produise.

Y a-t-il un meilleur moyen, ou est-ce la meilleure approche?

+1

Vous ne savez pas si c'est ce que vous cherchez: https://stackoverflow.com/questions/30407352/how-to-prevent-a-race-condition-when-multiple-processes-attempt-to-write-to- et – RetardedJoker

+0

Je seconde la suggestion ci-dessus. Les verrous au niveau du système de fichiers sont suffisants à cet effet. Vous pouvez également essayer d'exécuter le script python en tant que démon gérant des événements inotify si votre système de fichiers le supporte. Voir [suggestions pour les solutions inotify et crossplatform dans cet article] (https://stackoverflow.com/q/12582720/1328439) –

Répondre

0

Vous pouvez utiliser les étapes ci-dessous:

  1. script Python qui fonctionne en Cron vérifiera si le fichier est ouvert par un autre processus. Sous Linux, cela peut être fait en utilisant lsof.
  2. Si le fichier est ouvert, lorsque cron s'exécute, il ne traitera pas les données du fichier.
  3. La même logique peut ajouter pour le script qui ajoutera des données au fichier, si le fichier est utilisé par d'autres scripts.
1

Vérifiez this answer to see if the file is already open et si elle est, attendez 5 minutes de plus jusqu'à ce que, ou dormir alternativement à l'intérieur et essayez à nouveau toutes les 10 secondes jusqu'à ce que cela fonctionne, mais pas plus de 4 minutes, par exemple:

for i in range(attempts): 
    if not fileInUse(): 
     processFile() 
    else: 
     time.sleep(10)