2017-10-11 4 views
1

J'ai écrit ce script afin d'extraire les métadonnées des données sur ftp spécifique puis de l'enregistrer dans un répertoire spécifique et j'attends un temps aléatoire et d'extraire à nouveau etc ... Donc il y a 2 points: : pour extraire du ftp spécifique Deuxièmement: pour l'enregistrer et attendre un temps aléatoire qui dépend du ftp utilisé.Redémarrer le thread après exception sur Python

Parfois j'ai un problème de timeout de ftp. Quand cela se produit, il n'y a plus d'extraction, de sauvegarde ou d'attente du thread. Les autres threads continuent de fonctionner jusqu'à ce qu'ils rencontrent un problème de timeout aussi.

J'ai essayé d'attraper une exception afin de "redémarrer" le thread concerné par le problème du délai d'attente ftp. Mais rien ne change.

Quelqu'un s'il vous plaît peut m'aider à trouver un moyen de "redémarrer" le fil?

Un grand merci de

class ftp_id(Thread): 
    def __init__(self, ftpID): 
     Thread.__init__(self) 
     self.ftpID = ftpID 
    def run(self): 
     while True: 
      with verrou: 
       siteID = self.ftpID 
       directory = str(datetime.now())[:-16].replace('-', '') 
       filename = siteID + '_' + str(datetime.now())[:-7].replace(':', '').replace(' ', '_').replace('-', '') + '.txt' 
       dictstr = myExtract(siteID) 
       myWriteFile(directory, filename, dictstr) 
       pendingtime = myWaiting(siteID, dictstr) 
      time.sleep(pendingtime) 
     except : 
      self.stop = True 
      self.stop = False 
      self.start() 
      self.join() 

thread_01 = ftp_id("ftp-01") 
thread_02 = ftp_id("ftp-02") 
thread_03 = ftp_id("ftp-03") 
thread_04 = ftp_id("ftp-04") 

thread_01.start() 
thread_02.start() 
thread_03.start() 
thread_04.start() 

thread_01.join() 
thread_02.join() 
thread_03.join() 
thread_04.join() 
+0

Il ne jette une exception? Pourquoi n'avez-vous pas le bloc 'try-except' dans votre boucle' while '? –

Répondre

2

threads ne peuvent pas être redémarrés en python ... de gros vous pouvez simplement mettre en œuvre votre propre classe « thread » des thats pas vraiment un fil

class ftp_id(object): # this is a bad name for a class please see pep8 
    def __init__(self, ftpID): 
     super(ftp_id,self) 
     self.ftpID = ftpID 
     self.thread = None 
     self.thread_stop = False 
    def __getattr__(self): 
     return getattr(self.thread) 
    def start(self): 
     if self.thread: 
      self.thread_stop = True 
      self.thread.terminate() 
      self.thread.join() 

     self.thread = threading.Thread(target = self.run) 
     self.thread.start() 
    def run(self): 
     self.thread_stop = False 
     while not self.thread_stop: 
      with verrou: 
       siteID = self.ftpID 
       directory = str(datetime.now())[:-16].replace('-', '') 
       filename = siteID + '_' + str(datetime.now())[:-7].replace(':', '').replace(' ', '_').replace('-', '') + '.txt' 
       dictstr = myExtract(siteID) 
       myWriteFile(directory, filename, dictstr) 
       pendingtime = myWaiting(siteID, dictstr) 
      time.sleep(pendingtime) 

bien que je ne sais pas si cela répond réellement à votre question

2

Les fils ne peuvent pas être redémarrés. Vous devez donc mettre à l'exception de manutention à l'intérieur du while -bloc, et ne jamais sortir de la boucle:

def download(server): 
    while True: 
     try: 
      with verrou: 
       now = datetime.now() 
       directory = '{:%Y%m%d}'.format(now) 
       filename = '{}_{:%Y%m%d_%H%M%S}.txt'.format(server, now) 
       dictstr = myExtract(server) 
       myWriteFile(directory, filename, dictstr) 
       pendingtime = myWaiting(server, dictstr) 
      time.sleep(pendingtime) 
     except: 
      # restart 
      pass 

threads = [ 
    Thread(target=download, args=(server,)) 
    for server in ["ftp-01", "ftp-02", "ftp-03", "ftp-04" 
] 

for thread in threads: 
    thread.start() 

for thread in threads: 
    thread.join()