2017-07-27 1 views
-1

J'ai deux scripts qui mettent à jour le même fichier. Les deux peuvent fonctionner en même temps. Comment puis-je empêcher les mises à jour incohérentes du fichier? En d'autres termes, comment sérialiser l'accès au fichier?Synchronisation de l'accès inter-processus pour la mise à jour d'un fichier commun

Laissez-moi vous expliquer la question. Supposons qu'il existe un fichier d'étagère et que 2 scripts le mettent à jour. Script 1 fait ceci:

import shelve 
sf = shelve.open('some_file') 
sf[key1] = data1 
sf.close() 

Script 2 a le code suivant:

import shelve 
sf = shelve.open('some_file') 
sf[key2] = data2 
sf.close() 

scénario 2 est prévu Suppose après le script 1 ouvre le fichier. Lorsque le script 2 termine et contrôle le retour au script 1, le script 1 effectue sa mise à jour et ferme le fichier. Cela entraînera la mise à jour du script 2 se perdre. Comment empêcher que cela se produise afin que les deux mises à jour soient apportées au fichier?

Répondre

1

Vous pouvez utiliser un verrou grossier pour vous assurer qu'un seul client est autorisé à accéder au fichier à un moment donné.

Étant donné que vous êtes dans des processus distincts, vous avez besoin d'une sorte de ressource partagée pouvant être lue par tous les collaborateurs.

Redis fournit des primitives de couple qui rendent cela plus facile (TTL sur les serrures), et comme il est aide un seul thread à raisonner sur l'accès simultané à elle:

https://redis.io/topics/distlock

+0

Peut-il être fait en utilisant la bibliothèque standard ? Puis-je utiliser la fonction de verrouillage dans le module 'multiprocessing'? – debashish

+0

'redlock' ne verrouille pas explicitement le fichier. Il crée un verrou sur une chaîne qui représente la ressource (fichier). Mais ça fait le travail. – debashish