2014-05-16 74 views
0

我有一個遞歸運行的程序,雖然有95%的時間不是問題,但有時如果我花費的時間太長,我會遇到遞歸限制。在我的努力轉化爲和迭代的代碼,我決定嘗試沿着此線的東西:python無限循環和time.sleep()有什麼不對嗎?

while True: 
    do something 

    #check if task is done 
    if done: 
     print 'ALL DONE' 
     break 
    else: 
     time.sleep(600) 
     continue 

我測試過我的代碼,它工作正常,但我想知道是否有什麼內在的錯誤這種方法?如果運行時間太長,它會吃掉內存還是使機箱崩潰?

在此先感謝!

編輯:

該「做什麼」我指的是定期檢查某些關鍵字的日誌文件,數據不斷被寫入日誌文件。一旦這些行被寫入,發生在不同的時間長度,我讓腳本執行某些任務,例如將特定的行復制到單獨的文件中。

我原來的程序有兩個功能,一個定期調用自身,直到找到關鍵字,然後調用'dosomething'函數。完成後,該做些什麼功能,然後將調用原有的功能,而這會發生,直到任務結束或我打的遞歸限制

+1

它在做什麼?取決於你在做什麼,可能有或可能沒有更好的方法。看起來您正在等待某些事情完成,在這種情況下,您的代碼可能會有一個界面自動等待,直到完成而無需不斷檢查進度。 – user2357112

+0

你希望通過睡眠而不是立即回到循環中獲得什麼? – jwodder

+0

@jwodder無需任何理由就會吃掉CPU時間。 –

回答

2

這種模式沒有什麼固有的錯誤。我在init.d中使用了守護進程功能來啓動一個非常類似的python腳本。只要「做某件事」不會泄漏,它應該能夠永遠運行。

1

我認爲,無論哪種方式

time.sleep() 

不會停止遞歸限制 因爲只有睡眠暫停執行,並不會釋放任何內存 檢查https://docs.python.org/2/library/time.html的Time.sleep()描述

它暫停運作,但它不會做任何優化內存

0

您描述的模式很容易實現,但通常不是執行任務的最佳方式。如果任務在您檢查完成後完成,您仍然需要等待5分鐘才能恢復處理。但是,有時候別無選擇,只能這樣做;例如,如果完成檢測任務的唯一方法是檢查文件的存在,則可能需要這樣做。在這種情況下,時間間隔選擇需要平衡由「旋轉」消耗的CPU與等待時間。

另一種相當簡單的模式是在等待任務完成時簡單地阻塞。這是否容易取決於您使用的特定API。但是這種技術不能擴展,因爲所有的處理都必須等待一個單獨的活動才能完成。想象一下,在加載頁面時無法打開新的瀏覽器選項卡。

今天的最佳實踐通常使用幾種模型之一進行異步處理。就像在網站或GUI中編寫用於鼠標點擊的事件處理程序等一樣,您可以編寫處理處理結果的回調函數,並將該回調傳遞給任務。沒有CPU被浪費並且響應立即被處理而不用等待。許多框架今天都支持這種模式。 Tulip使用演員模型。

特別是關於遞歸限制,我不認爲你的睡眠循環負責達到棧幀限制。也許這是任務本身發生的事情。