2008-10-17 85 views
9

我已經實現了一個python web服務器。每個http請求都會產生一個新線程。 我有要求在內存中緩存對象,並且因爲它的網絡服務器,我希望緩存是線程安全的。 python中有一個線程安全對象緩存的標準實現嗎?我發現下面python線程安全對象緩存

http://freshmeat.net/projects/lrucache/

這看起來是線程安全的。任何人都可以指出我在python中實現線程安全緩存嗎?

謝謝!

回答

8

那麼Python中的很多操作默認都是線程安全的,所以標準字典應該沒問題(至少在某些方面)。這主要是由於GIL,這將有助於避免一些更嚴重的線程問題。

有一個清單:http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html可能是有用的。

儘管這些操作的原子性質意味着如果您有兩個線程同時訪問字典,您將不會有完全不一致的狀態。所以你不會有一個損壞的價值。然而,你會(像大多數多線程編程一樣)不能依賴那些原子操作的特定順序。

因此削減長話短說...

如果你有相當簡單的要求,並沒有打擾一下什麼被寫入到緩存,那麼你可以使用字典,知道你的訂購總會得到一致/未損壞的值(它可能會過時)。

如果你想確保事情比較一致的關於閱讀和寫作一點,那麼你可能想看看Django的本地內存緩存:

http://code.djangoproject.com/browser/django/trunk/django/core/cache/backends/locmem.py

它使用讀/寫鎖用於鎖定。

4

您可能想要使用memcached。它的速度非常快,非常穩定,很受歡迎,具有良好的Python庫,並允許您將增長到分佈式緩存如果您需要:每個請求

http://www.danga.com/memcached/

9

主題往往是一個壞主意。如果你的服務器承受巨大的負載峯值,它會使盒子屈膝。考慮使用一個線程池,該線程池在高峯使用期間可以增長到有限的大小,並在負載較輕時縮小到較小的大小。

2

對於一個線程安全的對象,你想threading.local:

from threading import local 

safe = local() 

safe.cache = {} 

然後你可以把和檢索線程安全safe.cache對象。

+2

您應該指出線程本地緩存不會在線程之間共享對象。 – 2014-06-12 23:02:35