2008-10-17 36 views
9

Tôi đã triển khai một máy chủ web python. Mỗi yêu cầu http sinh ra một luồng mới. Tôi có một yêu cầu của bộ nhớ đệm các đối tượng trong bộ nhớ và kể từ khi một máy chủ web của nó, tôi muốn bộ nhớ cache được thread an toàn. Có một tiêu chuẩn thực hiện của một chủ đề an toàn bộ nhớ cache trong python? Tôi tìm thấy sau đâypython threadsafe object object cache

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

Đây không phải là chủ đề an toàn. Ai có thể chỉ cho tôi một thực hiện tốt của bộ nhớ cache an toàn thread trong python?

Cảm ơn!

Trả lời

8

Cũng có rất nhiều thao tác trong Python là an toàn luồng theo mặc định, do đó, từ điển chuẩn phải ổn định (ít nhất là ở một số khía cạnh nhất định). Điều này chủ yếu là do GIL, điều này sẽ giúp tránh được một số vấn đề nghiêm trọng hơn về luồng.

Có danh sách ở đây: http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html có thể hữu ích.

Mặc dù bản chất nguyên tử của các hoạt động đó chỉ có nghĩa là bạn sẽ không có trạng thái hoàn toàn không nhất quán nếu bạn có hai chuỗi truy cập từ điển cùng một lúc. Vì vậy, bạn sẽ không có một giá trị bị hỏng. Tuy nhiên bạn sẽ (như với hầu hết các chương trình đa luồng) không thể dựa vào thứ tự cụ thể của những hoạt động nguyên tử đó.

Vì vậy, để cắt một câu chuyện dài ngắn ...

Nếu bạn có yêu cầu khá đơn giản và không để phiền về Trật tự của những gì được ghi vào bộ nhớ cache sau đó bạn có thể sử dụng một từ điển và biết rằng bạn sẽ luôn nhận được giá trị nhất quán/không bị hỏng (nó chỉ có thể lỗi thời).

Nếu bạn muốn đảm bảo rằng mọi thứ đang ổn định hơn một chút liên quan đến đọc và viết với sau đó bạn có thể muốn nhìn vào bộ nhớ cache cục bộ của Django:

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

Trong đó sử dụng một đọc/ghi khóa để khóa.

4

Bạn có thể muốn sử dụng memcached để thay thế. Nó rất nhanh, rất ổn định, rất phổ biến, có thư viện python tốt, và sẽ cho phép bạn phát triển đến một bộ nhớ cache phân phối nên bạn cần phải:

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

9

Chủ đề theo yêu cầu thường là một ý tưởng tồi. Nếu máy chủ của bạn gặp phải sự cố đột biến lớn về tải, nó sẽ lấy hộp đến đầu gối của nó. Hãy xem xét sử dụng một hồ bơi thread có thể phát triển đến một kích thước giới hạn trong thời gian sử dụng cao điểm và thu nhỏ đến một kích thước nhỏ hơn khi tải là ánh sáng.

2

Đối với một đối tượng an toàn chủ đề mà bạn muốn threading.local:

from threading import local 

safe = local() 

safe.cache = {} 

Sau đó bạn có thể đặt và lấy đối tượng trong safe.cache với chủ đề an toàn.

+2

Bạn nên chỉ ra rằng bộ đệm cục bộ cục bộ sẽ không chia sẻ các đối tượng trên các chuỗi. –