2011-08-16 31 views
5

Tôi có một máy chủ xoắn mà không một số "dài" nhiệm vụ cho mỗi yêu cầu vì vậy tôi trì hoãn thread mỗi cuộc gọi. Trong mỗi yêu cầu, tôi truy cập vào một tài nguyên chung, được thay đổi trong suốt quá trình. Mỗi yêu cầu nên bắt đầu với dữ liệu gốc để tôi sử dụng bản in sâu trên tài nguyên chung (trong khi gọi một khóa có được). Nó hoạt động, NHƯNG tôi nghĩ nó không đủ nhanh. Tôi có cảm giác rằng sâu sắc đang làm chậm mọi thứ một chút.Xoắn luồng làm thế nào để tránh deepcopy

Bạn có đề xuất gì khi xử lý máy chủ xoắn có luồng với đột biến tài nguyên?

+0

Trong những gì nó không đủ nhanh? Máy chủ của bạn không thể xử lý N yêu cầu mỗi giây? Một yêu cầu duy nhất có quá lâu không? Nó có chậm hơn khi bạn tăng số lượng yêu cầu đồng thời không? – stderr

+0

Một yêu cầu duy nhất không mất quá nhiều thời gian. Nó không chậm hơn khi tôi tăng số lượng yêu cầu đồng thời. Kích thước hồ bơi lò phản ứng xoắn được đặt thành 25. – Catalin

Trả lời

2

Nếu bạn thích, bạn chỉ có thể đồng bộ hóa quyền truy cập vào tài nguyên được chia sẻ với threading.Lock giống như bạn làm trong bất kỳ chương trình được tạo luồng nào khác thay vì sao chép nó.

Bất kể, tôi nghĩ rằng nó đáng để đánh giá mã của bạn có và không có độ sâu và đo lường khác để biết hiệu suất hoạt động tốt/xấu trước khi thực hiện tối ưu hóa. Có lẽ lý do nó là chậm không có gì để làm với deepcopy.

CHỈNH SỬA về việc sử dụng khóa: Ý tôi là bạn có thể sử dụng nhiều khóa hạt mịn hơn quanh tài nguyên này. Tôi cho rằng các chủ đề của bạn đang làm nhiều hơn việc truy cập tài nguyên được chia sẻ. Bạn có thể cố gắng hưởng lợi từ nhiều chủ đề làm việc và sau đó đồng bộ hóa quyền truy cập vào chỉ một "phần quan trọng" có liên quan đến việc ghi vào tài nguyên được chia sẻ. Bạn cũng có thể điều tra việc tạo luồng an toàn tài nguyên được chia sẻ của mình. Ví dụ, nếu có một đối tượng chia sẻ, SillyExampleFriendsList:

class SillyExampleFriendsList(object): 
    """Just manipulates a couple lists""" 
    def __init__(self): 
     self._lock = threading.RLock() 
     self._friends = [] 
     self._enemies = [] 

    def unfriend(self, x): 
     # we lock here to ensure that we're never in a state where 
     # someone might think 'x' is both our friend and our enemy. 
     self._lock.acquire() 
     self._friends.remove(x) 
     self._enemies.append(x) 
     self._lock.release() 

Vấn đề ở đây chỉ là các đối tượng trên có khả năng có thể được chia sẻ giữa nhiều chủ đề mà không deepcopy bằng cách sử dụng cẩn thận của ổ khóa. Nó không phải là tầm thường để xác định tất cả các trường hợp mà điều này có thể là cần thiết và chiến lược khóa hạt mịn có thể khó khăn hơn để gỡ lỗi và vẫn giới thiệu chi phí.

Điều đó nói rằng, bạn có thể không cần chuỗi, khóa hoặc bản soi sâu ở tất cả và không có điểm chuẩn mã của bạn, điều đó không rõ ràng nếu bạn gặp sự cố về hiệu suất cần được giải quyết. Tôi tò mò điều gì khiến bạn nghĩ rằng mã của bạn nên, hoặc cần phải nhanh hơn?

+0

+1 xác định cho ý kiến ​​"điểm chuẩn và hồ sơ đầu tiên". Thường thì mọi người tối ưu hóa những điều sai trái, ngay cả khi họ biết điều gì đó thực sự chậm. – Glyph

+0

Nếu tôi đồng bộ hóa quyền truy cập vào tài nguyên với luồng.Lock sẽ có nghĩa là tôi đi một chuỗi. Điểm chuẩn là điều chắc chắn là trên TODO. – Catalin

+0

Hoạt động cá nhân trên danh sách là luồng an toàn trong CPython, vì vậy 'SharedList' ở đây không làm bất cứ điều gì hữu ích. –

3

Hãy thử vận ​​hành với dữ liệu tối thiểu có thể trong chuỗi công việc của bạn. Vượt qua tất cả dữ liệu mà chúng cần trong các đối số và lấy tất cả các đầu ra của chúng làm giá trị trả về (giá trị mà Deferred cháy với) thay vì là các đột biến cho các đầu vào.

Sau đó tích hợp kết quả vào cấu trúc dữ liệu chung trong chuỗi bộ phản ứng.

Điều này cho phép bạn giải thích về công việc một cách độc lập và tránh bất kỳ khóa bổ sung nào (kết quả là tranh chấp, làm chậm mọi thứ bên cạnh việc khiến chúng khó hiểu hơn).

+0

Bạn có gặp một số ví dụ/hướng dẫn để chia sẻ không? – Catalin

Các vấn đề liên quan