2011-08-03 31 views
2

我正在使用Python模塊(PyCLIPS)和Django 1.3。Django中請求之間的共享對象

我想開發一個線程安全類,它實現了對象池和單例模式,並且必須在Django中的請求之間共享。

例如,我要做到以下幾點:

  • 的請求獲得來自池中的某些ID的對象,做 一些與它,並將它推回池中,然後發送響應 與對象的ID。
  • 另一個具有對象ID的請求從池中獲取給定ID的對象 ,並重覆上述請求中的步驟。
  • 但是當服務器運行時,對象的狀態必須保持在池中。

它應該像Singleton Session Bean in Java EE

我應該怎麼辦呢?有什麼我應該閱讀?

更新: 我無法從池中存儲對象在數據庫中,因爲這些對象是寫在C語言庫這對Expert System Engine CLIPS API下包裝。

謝謝!

+0

您是否嘗試過使用Django的緩存框架[https://docs.djangoproject.com/en/dev/topics/cache/](https://docs.djangoproject.com/zh/dev/topics/cache /)?您可能能夠在請求之間緩存/保留您的對象在內存中。 – lwg643

回答

6

嗯,我認爲在這裏需要一個不同的角度。 Django不像Java,該解決方案應該適合多進程環境,而不是多線程環境。

Django沒有即時等價的單例會話bean。

這就是說,我看不出任何理由你的描述不適合經典的數據庫模型。您希望保存每個對象數據,這些數據應始終保留在數據庫層中。

否則,您可以隨時在會話中保存內容,Django爲登錄用戶以及匿名用戶提供的內容 - see the docs on Django sessions

考慮到運行Java Web容器與Python/Django多進程環境之間的巨大差異,使用Java環境中可能熟悉的任何其他模式最終會失敗。


編輯:很好,考慮到這些對象不是當地的您的應用程序通過一個第三方庫而訪問的,但它確實使事情變得複雜。我的直覺是,這些對象不應該由Web層來處理,而應該通過某種可以從多進程環境訪問的外部服務來處理。正如丹尼爾所說,你可以隨時把它們扔進緩存中(如果這些對象是可以醃製的)。但感覺好像這些對象不屬於Web層。

+0

你知道另一個允許這樣做的Python框架嗎? –

+1

呃,不是。大多數主流Web框架都在多進程環境中工作。 Java是一種奇怪的生物,它總是在單個JVM上運行。 –

+0

Okey,據我所知,在JavaEE中沒有一種實現與singleton會話bean相同的模式的好方法。因此,我認爲,我必須使用JavaEE。 –

1

這些數據庫對象?因爲如果是這樣的話,db本身就是池,並且不需要做任何特別的事情 - 每個請求都可以獨立地從db中加載實例,對其進行修改並將其保存回去。評論好後

編輯,最大的問題是,生產Web服務器環境很可能是多進程的,所以任何全局變量(即池)沒有進程間共享。您需要將它們存儲在的某個地方這是全球可訪問的。在黑暗中短暫,但他們是使用泡菜序列化?如果是這樣,那麼也許memcache可能工作。

+0

不,我不能將對象存儲在數據庫中,因爲這些對象是用C語言編寫的庫下的包裝器,它是Expert System Engine CLIPS的API。 –

+0

也許,我可以在進程之間共享這個變量,就像Java EE中的單例會話bean(http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html#gipim) –

+0

我有一個類似的問題:我需要一個具有狀態訪問外部數據源的類的實例。如果我在模塊級別實例化其中的一個,我是否會爲每個工作者獲得一個實例,因此,一次只能由該工作者處理的一個請求使用?我的Django代碼的執行模型是什麼? –

1

假設該對象無法被清理,您將需要創建一個應用程序來管理該對象以及所有需要針對它進行的交互。最簡單的實現可能是創建一個單一進程的wsgi應用程序(在不同的端口上),暴露一個API來執行所有你需要的操作。無論您使用REST風格的API還是表單帖子,都取決於您的個人喜好。