2017-10-08 3 views
0

Je veux ouvrir 3 Powershell et exécuter le même code à 3 d'entre eux, juste des fichiers différents.
Comme ils ont exactement la même logique, chacun d'entre eux tenteront d'accéder à chaque autres fichiers pour vérifier s'il y a quelque chose d'écrit il
Process1 a client1.txt, Process2 a client2.txt et processus3 a client3.txt
Voici un code à ce processus 3 doit vérifier avant de choisir quel problème pour travailler sur:Lire un fichier, seulement si aucun autre 'processus' ne fonctionne

import os 
while True: 
f = 'C:\Users\Files' 
i = {} 
i['word'] = 'problem X' #just an example, I'll have a whole list 
if os.path.exists(f): 
    try: 
     os.rename(f, f) 
     print 'Access on file "' + f +'" is available!' 
     file1 = open('C:\Users\Files\client1.txt', 'r+') 
     file2 = open('C:\Users\Files\client2.txt', 'r+') 
     if file1.read() == i['word']: 
      print "A process is already working on this problem, check another" 
     elif file2.read() == i['word']: 
      print "A process is already working on this problem, check another" 
     else: 
      print "Found a new problem to work on" 
      file3 = open('C:\Users\Files\client3.txt', 'r+') 
      file3.write(i['word']) 
      file1.close() 
      file2.close() 
      file3.close() 

    except OSError as e: 
     print 'Access-error on file "' + f + '"! \n' + str(e) 
     time.sleep(5) 
     pass 

ce que j'ai essayé de représenter à travers le code: Je veux seulement un processus pour démarrer un problème si les autres ne sont pas travailler dessus déjà, car ils ont tous la même logique qu'ils essaieront de résoudre le même problème (j'ai beaucoup à résoudre) et donc ils pourraient atteindre à peu près en même temps que le programme continue avec le while True.
Lorsque le problème est résolu, il supprime le contenu du fichier et sélectionne un nouveau problème, puis écrit le problème sur lequel il travaille dans son propre fichier pour que les autres vérifient plus tard. Juste pour être un peu clair: disons que process1 a trouvé un problème de travail en premier ('AAA'), ils ont tous des fichiers txt vides, ça va vérifier txt2 et txt3 et voir que ce n'est pas égal à ('AAA '), alors il va l'écrire dans son propre fichier et le fermer.
Je veux process2 qui pourrait y arriver une seconde plus tard pour lire à la fois txt1 et txt3 et voir que ('AAA') est déjà en train d'être travaillé, il aura le prochain dans la liste et vérifier à nouveau, voir (' BBB ') va bien et va écrire sur son propre fichier.
Quand il se termine, il supprime la chaîne du txt et commence à chercher un autre.

Il y a le problème des deux processus essayant de vérifier les fichiers en même temps. Peut-être que s'il y a un moyen de mettre un time.sleep() à un processus si un autre processus utilise le fichier, puis réessayer un peu plus tard?

+0

pas un doublon, mais peut-être pertinente: https://stackoverflow.com/questions/30407352/how-to-prevent-a-race-condition-when-multiple-processes-attempt-to -write-to-and – paisanco

+0

@paisanco Je ne comprends que l'idée générale, car je suis novice en python, mais c'est vraiment intéressant. Pensez-vous que le bloc dont ils parlent bloque le type de processus que je veux ou simplement le filetage/multiprocessus et tout ce qui a un 'lien'? – Tax

Répondre

2

Idéalement, vous devez utiliser le module multiprocessing de Python pour démarrer chaque processus. Vous pouvez avoir un processus de surveillance pour les nouveaux fichiers et les alimenter vers un queue que vos processus de travail lisent. Cette solution élimine le besoin de verrouiller les fichiers, car un seul processus recherche toujours de nouveaux fichiers.

Si vous devez cependant démarrer les processus via Power Shell, vous devrez utiliser un certain type de verrouillage pour que les processus fonctionnent ensemble. Le vrai verrouillage de fichier est difficile à faire d'une manière multi-plateforme. Vous pouvez simuler en utilisant déplacer si. Par exemple, vous pouvez essayer de déplacer le fichier (le déplacement est atomique sur la plupart des systèmes d'exploitation en supposant que vous vous déplacez vers un emplacement sur le même système de fichiers). Si le transfert échoue, vous savez qu'un autre processus a dû l'être en premier, ou quelque chose s'est très mal passé avec le système d'exploitation. Vous pouvez ensuite effectuer tout votre traitement sur le fichier déplacé. Par exemple:

import path 
import shutil 

filename = "C:\\path\\to\\filename.txt" 
_filename = os.path.join(os.path.basename(filename), ".wip") 
wip_filename = os.path.join(os.path.dirname(filename), _filename) 

try: 
    shutil.move(filename, wip_filename) 
except OSError: 
    # another process moved it first 
    pass 
else: 
    do_work(wip_filename) 
+0

Vous m'avez expliqué certains de mes propres codes, que je n'avais pas compris auparavant. Je suppose que ça ne peut pas être aidé, je vais arrêter de me cacher dans la peur du multitraitement et de la file d'attente. Merci – Tax