2012-05-03 24 views
14

Tôi muốn tìm một cấu trúc xếp hàng (một vùng chứa dữ liệu) mà các phần tử của nó phải là đầu tiên-trong-đầu-ra. Điều quan trọng đối với tôi là cấu trúc phải an toàn chỉ. Tôi sẽ sử dụng vùng chứa dữ liệu này như một công việc hoặc một nhóm kết nối.Có thể sử dụng kênh đệm của Go làm hàng đợi an toàn không?

Tôi biết kênh đệm là an toàn chỉ, nhưng tôi tự hỏi nếu nó hoạt động như FIFO, đặc biệt là trong một tình huống đồng thời.

Và nếu có thể sử dụng kênh đệm làm hàng đợi an toàn theo chủ đề, tôi có cần phải lo lắng về hiệu quả của nó không?

+1

Kênh là câu trả lời. Có rất ít cơ hội tìm kiếm hoặc viết một cái gì đó tốt hơn so với các kênh cho một nhiệm vụ như vậy. – Mostafa

+1

Các kênh đặc biệt phù hợp với hàng đợi công việc, chia sẻ tài nguyên, các hồ bơi kết nối và các kênh tương tự. Cẩn thận để không tái tạo các mẫu ngôn ngữ dựa trên luồng là một trong những tiến bộ lớn của ngôn ngữ Go là cơ chế goroutine + channel. Hãy chắc chắn để hiểu nó (bạn có thể có thể gửi một kiến ​​trúc hoặc chiến lược để SO). –

+1

Đây là điều đầu tiên tôi nghĩ đến khi tôi tìm hiểu về các kênh trong Go, cảm ơn vì đã hỏi điều này! – karysto

Trả lời

2

Tôi chắc chắn rằng Kênh là FIFO. Chúng cũng rẻ vì vậy chúng sẽ là bộ nhớ hiệu quả. Ngoài ra mà không biết chi tiết về cách bạn sẽ sử dụng chúng Chúng tôi không thể thực sự đưa ra lời khuyên nhiều hơn nữa.

+0

Cảm ơn. Vì vậy, các kênh đều là FIFO và Thread-Safe? Bạn vui lòng cho tôi một liên kết hoặc một cái gì đó về các chi tiết thực hiện của cơ chế của kênh? – hardPass

+0

Tài liệu chính thức sẽ là: http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.c Xem việc triển khai chansend và chanrecv để biết chi tiết. Các đặc điểm kỹ thuật không cụ thể nói rằng họ là một hàng đợi nămo nhưng nó có thể phát sinh tôi nghĩ từ các chi tiết về cách sử dụng chúng. –

+0

Nhưng đó là một câu hỏi, tôi nghĩ nếu sử dụng các kênh golang sẽ được nhiều lần, ít an toàn, tiêu chuẩn và đầy đủ hơn là sử dụng một nhà môi giới tin nhắn như RabbitMQ hoặc ActiveMQ với nỗ lực tương tự ở cuối. Vì vậy, tôi không nghĩ rằng đó là một aproach bồi thường – deFreitas

11

Trong Go, kênh được đệm chỉ là: một hàng đợi ANO an toàn chủ đề FIFO vì vậy những gì bạn đang cố gắng làm là hoàn toàn hợp lệ. Bạn không nên có vấn đề về hiệu suất nào cả với cách tiếp cận này.

0

Nói chung, tôi sẽ nói kênh đệm không tạo hàng đợi an toàn đồng thời tốt. Tạo chúng phân bổ bộ nhớ cho toàn bộ bộ đệm. Nếu kích thước hàng đợi của bạn thay đổi từ rất nhỏ đến rất lớn trong khi thực thi, bạn phải phân bổ cho kịch bản trường hợp xấu nhất và có thể lãng phí rất nhiều bộ nhớ.

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