2008-10-17 19 views
9

Zaimplementowałam serwer sieciowy Python. Każde żądanie http spawnuje nowy wątek. Mam wymóg buforowania obiektów w pamięci, a ponieważ jest to serwer WWW, chcę, aby pamięć podręczna była bezpieczna dla wątków. Czy istnieje standardowa implementacja pamięci podręcznej obiektów bezpiecznego wątku w pythonie? Znalazłem następującePython threadsafe object cache

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

To nie wygląda się być bezpieczne dla wątków. Czy ktokolwiek może wskazać mi na dobrą implementację wątku bezpiecznego w Pythonie?

Dzięki!

Odpowiedz

8

Wiele operacji w Pythonie jest domyślnie wątkowych, więc standardowy słownik powinien być w porządku (przynajmniej pod pewnymi względami). Wynika to głównie z GIL, który pomoże uniknąć niektórych poważniejszych problemów z gwintowaniem. Jest to lista: http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html, która może być przydatna.

Chociaż atomowa natura tej operacji oznacza po prostu, że nie będziesz miał całkowicie niespójnego stanu, jeśli masz dwa wątki uzyskujące dostęp do słownika w tym samym czasie. Więc nie miałbyś zepsutej wartości. Jednak (jak w przypadku większości programów wielowątkowych) nie można polegać na określonej kolejności tych operacji atomowych.

więc wyciąć długie opowiadanie ...

Jeśli masz dość proste wymagania i nie są do przejął zamawiania co się zapisana w pamięci podręcznej można użyć słownika i wiedzieć, że zawsze uzyska spójną/niezepsutą wartość (może być po prostu nieaktualna).

Jeśli chcesz mieć pewność, że rzeczy są nieco bardziej spójne w zakresie czytania i pisania, to możesz zajrzeć do Django lokalnej pamięci podręcznej:

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

który wykorzystuje odczytu/zapisu blokadę do blokowania.

4

Prawdopodobnie chcesz użyć memcached zamiast tego. Jest bardzo szybki, bardzo stabilny, bardzo popularny, ma dobre biblioteki Python, i pozwala rosnąć do rozproszonej pamięci podręcznej powinien musisz:

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

9

Temat na żądanie jest często zły pomysł. Jeśli twój serwer doświadczy ogromnych skoków obciążenia, zabierze to pudełko na kolana. Rozważ użycie puli wątków, która może wzrosnąć do ograniczonego rozmiaru podczas maksymalnego wykorzystania i zmniejszyć się do mniejszego rozmiaru, gdy obciążenie jest niewielkie.

2

Dla bezpiecznego obiektu wątku chcesz threading.local:

from threading import local 

safe = local() 

safe.cache = {} 

Następnie można umieszczać i pobierać obiekty safe.cache z bezpieczeństwem wątku.

+2

Należy zauważyć, że pamięć podręczna wątku lokalnego nie będzie współużytkować obiektów między wątkami. –

Powiązane problemy