2017-10-11 84 views
1

我编写了这个脚本,以便从特定的ftp上的数据中提取元数据,然后将其保存在特定的目录中,并等待一个随机时间并再次提取等等...... 所以有2点: :从特定的ftp提取 第二:保存并等待随机时间,这取决于所使用的ftp。Python异常后重新启动线程

有时候我有ftp超时问题。当它发生时,不再有提取,保存或等待线程。其他线程继续工作,直到它们也遇到超时问题。

我试图捕捉异常,以便“重新启动”涉及ftp超时问题的线程。但没有任何变化。

有人请帮我找到一种方法来“重新启动”线程?

许多感谢的

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

所以它抛出一个异常?你为什么不在''True''循环中有'try-except'模块? –

回答

2

线程不能在Python重新启动......粗,你可以只实现自己的“线程”级那不是一个真正的线程

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) 

虽然我不知道的如果这实际上回答您的问题

2

线程无法重新启动。所以,你应该把异常的while - 块内部处理,决不退出循环:

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()