2012-12-14 71 views
1

我有一個作爲無線手持計算機的服務器運行的Python模塊。每當手持設備向服務器發送消息時,模塊就會確定它是什麼類型的消息,然後組裝適當的響應。因爲響應通常是依賴於狀態的,所以我使用全局變量來保留/共享處理每種消息類型的各個函數之間的信息。保存和恢復執行之間的變量值

我遇到的問題是應用程序關閉時(無論出於何種原因),全局變量值(當然)丟失了,所以在重新啓動應用程序時,它與手持設備不同步。我需要一種可靠的方式來存儲這些值以進行恢復。

我到目前爲止的方向(但還沒有得到它的工作)是將變量名和它們的值寫入磁盤上的CSV文件,每次更新 - 然後(當應用程序啓動時),查找該文件並使用它來將變量分配到其以前的狀態。我在編寫文件或閱讀文件方面沒有任何困難,但由於某些原因,這些值並未得到分配。

我可以發佈評論/幫助的代碼,但在此之前我想知道我是否剛剛走了一個完全錯誤的方向。有沒有更好的(或至少是可取的)方法來保存和恢復這些值?

感謝, JDM

====

跟進。這可能是一個觸摸klunky,但這是我有,它的工作。我關心的唯一全局變量是以「CUR_」開頭的全局變量。我不得不使用tempDict1,因爲解釋器似乎不喜歡直接在globals()上迭代。

 
    import pickle 
    CUR_GLO1 = 'valglo1' 
    CUR_GLO2 = 'valglo2' 
    CUR_GLO3 = 'valglo3' 

    def saveGlobs(): 
     tempDict1 = globals().copy() 
     tempDict2 = {} 
     for key in tempDict1: 
      if (key[:4]=='CUR_'):tempDict2[key] = tempDict1[key] 
     pickle.dump(tempDict2,open('tempDict.p','wb')) 

    def retrieveGlobs(): 
     tempDict = pickle.load(open('tempDict.p','rb')) 
     globals().update(tempDict) 
+1

如果您想方便地存儲和檢索Python變量,[pickle module](http://docs.python.org/2/library/pickle.html)可能更容易使用。有一個簡單的例子[這裏](http://wiki.python.org/moin/UsingPickle) – m01

+0

這將工作與單獨的全局(現在我有它)?或者我需要將存儲切換到字典/列表/無論什麼?我試圖完成的一部分是**不**必須在每次需要向狀態信息添加一條新信息時更新代碼的保存/恢復部分。 – JDM

+0

謝謝,@ m01。看起來'pickle'會很好地完成這項工作。 – JDM

回答

2

寫它作爲一個答案..

我想什麼你想要做的是application checkpointing一種形式。

您可以使用Pickle module來方便地保存和加載Python變量。以下是如何使用它的simple exampleThis discussion on Stackoverflowthis note似乎同意,雖然我的一部分認爲,必須有一個更好的方法。

順便說一句,你不需要把所有東西都放到字典中。只要你以正確的順序轉儲和加載變量,並確保你不改變它,在中間插入數據等,你可以轉儲並加載幾個變量。使用像你這樣的字典,雖然會消除排序依賴關係。

% python 
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> foo=123 
>>> bar="hello" 
>>> d={'abc': 123, 'def': 456} 
>>> f=open('p.pickle', 'wb') 
>>> pickle.dump(foo, f) 
>>> pickle.dump(bar, f) 
>>> pickle.dump(d, f) 
>>> ^D 
% python 
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> f=open('p.pickle','rb') 
>>> foo=pickle.load(f) 
>>> foo 
123 
>>> bar=pickle.load(f) 
>>> bar 
'hello' 
>>> d=pickle.load(f) 
>>> d 
{'abc': 123, 'def': 456} 
>>> 
+0

是的,檢查點正是目標。再次感謝您指引我朝着更好的方向發展。 – JDM

+0

@ m01,你有沒有找到更好的方法? – timbram

+0

您應該查看期刊/日記,請參閱關於[期刊(計算)](http://en.wikipedia.org/w/index.php?title=Journal_(計算))的Wikipedia頁面。我不確定是否有任何好的Python庫,我沒有在Python的上下文中研究它。一些文件系統(ext,hfs)和數據庫是日誌記錄的主要用戶。 Scala akka庫也可以[方便使用日記功能](http://doc.akka.io/docs/akka/snapshot/scala/persistence.html#Architecture)在事件(如重新啓動)之後播放消息。 – m01