2009-08-18 17 views
8

Tôi có một hàng đợi (từ mô-đun Queue) và tôi muốn truy cập được lập chỉ mục vào nó. (tức là, có thể yêu cầu mục số bốn trong hàng đợi, mà không xóa nó khỏi hàng đợi.)Cách tốt nhất để có được truy cập được lập chỉ mục vào hàng đợi Python, an toàn luồng

Tôi thấy rằng hàng đợi sử dụng deque trong nội bộ, và deque đã lập chỉ mục truy cập. Câu hỏi là, làm thế nào tôi có thể sử dụng deque mà không (1) rối tung lên hàng đợi, (2) phá vỡ thread-an toàn.

+1

Tại sao bạn sử dụng hàng đợi và không xếp hàng và khử mùi theo tuần tự? Đây có phải chỉ là một đối tượng được chia sẻ giữa các luồng không? –

+0

Tôi không chắc chắn những gì bạn có ý nghĩa của "enqueueing và dequeueing mọi thứ tuần tự". Tôi thậm chí không hiểu câu hỏi thứ hai của bạn: Có, hàng đợi được chia sẻ giữa các chủ đề. –

+1

Hàng đợi có thứ enqueued và dequeued theo thứ tự. Ý tưởng "theo thứ tự" có nghĩa là chúng hiếm khi được truy cập ngoài việc thêm vào một đầu và bật từ đầu kia. Tại sao bạn phá vỡ giả định mặc định này về "xếp hàng"? –

Trả lời

10
import Queue 

class IndexableQueue(Queue): 
    def __getitem__(self, index): 
    with self.mutex: 
     return self.queue[index] 

Đó là tất nhiên rất quan trọng để phát hành các mutex dù việc lập chỉ mục thành công hay đặt ra một IndexError, và tôi đang sử dụng một tuyên bố with cho điều đó. Trong các phiên bản Python cũ hơn, try/finally sẽ được sử dụng cho cùng một hiệu ứng.

+1

Vì vậy, sạch sẽ ... Tôi đang rối tung lên với các chủ đề trong Java bây giờ, và nó không vui lắm. –

+0

câu trả lời tuyệt vời. Thật không may, nó không phải là tài liệu bất cứ nơi nào mà hàng đợi là phù hợp (và thậm chí có nghĩa là, như bạn nói) để được phân lớp với quyền truy cập vào các thành viên nội bộ của nó. Của họ là "công khai" là đầu mối duy nhất. Ngay cả trong mã nguồn của mô-đun Queue.py nó nói nó một cách rõ ràng, và đây là một sự xấu hổ. Đoạn mã của bạn trong câu trả lời này phải là một ví dụ trong tài liệu chuẩn của Queue, IMHO –

+0

@eliben, bạn nói đúng rằng các tài liệu của nội bộ của Queue.py là (và từ lâu đã) không hiệu quả, nhưng ít nhất nó nhận được một chút tốt hơn ... ví dụ tại thời điểm chúng tôi ghi lại khả năng phân lớp của nó (công thức 9.3 trong bản sửa đổi thứ 2. của sách dạy nấu ăn) không có trong tài liệu, bây giờ ít nhất một vài lớp con hữu ích được cung cấp ... ;-). –