2017-10-11 85 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()