2013-06-12 60 views
0

我正在編寫一個加載來自不同文件類型的數據的程序。對於每個支持的文件類型,我都有迭代器。所以我可以通過例如一個文件的數據:迭代大文件時中斷下一個函數

it = MyIterator("filename") 
for data in it: 
    DoSomethingWithData(data) 

現在我想有可能停止此迭代。這基本上沒有問題,但在某些情況下,調用迭代器函數的功能需要很長時間,因爲文件中沒有可讀數據。在這些情況下,迭代器在沒有找到任何東西的情況下遍歷整個文件,直到達到結尾並引發StopIteration。

所以我想有機會停下來 - 或者更好地打斷下一個功能,不知道該怎麼做。我想我必須使用線程之類的東西,但是我也不能殺死線程。東西likethis將是很好:

def Iterate(): 
    it = MyIterator("filename") 
    for data in it: 
     self.t0 = time.time() 
     DoSomethingWithData(data) 

iterationThread = threading.Thread(target=Iterate) 
iterationThread.start() 

self.t0 = time.time() 
maxWaitingTime = 10. 
while iterationThread.IsAlive(): 
    if self.t0 - time.time() > maxWaitingTime: 
     KillThread(iterationThread) 

這就是通常我想要什麼,但我沒有功能,當然KillThread ...

所以有任何一個知道如何處理這樣的事情?並且它不可能改變迭代器本身...

+0

非常有趣的問題。我通常使用異步I/O來解決這個問題。但是在這種情況下,迭代器不能被修改的情況下,這是行不通的。 – Saish

回答

0

MyIterator聽起來像你控制它。

在這種情況下,您可以重新設計它,以便next()方法在沒有數據時返回早期返回None。然後

你的循環會看起來像

for data in it: 
    if data is not None: 
     DoSomethingWithData(data) 
+0

是的,'MyIterator'是我控制的東西。但它不僅僅是一個迭代器,它是一個動態選擇的迭代器。正如我已經說過的,更改迭代器本身是沒有選擇的。每個數據類型至少有一個迭代器,每個迭代器都有不同的工作方式,通常不是我自己編寫的。 – Jogi