2012-06-13 20 views
7

Tôi không có nhiều kinh nghiệm trong boost::asio. Tôi có một số câu hỏi khá cơ bản.Chúng ta có cần nhiều io_service cho mỗi luồng cho tăng luồng không :: máy chủ asio với một máy chấp nhận đơn

Tôi có cần phải có một khác nhau io_servicesocket khác theo một khác nhau thread nhưng một đơn acceptor, để xử lý ứng dụng khách trong máy chủ được tạo luồng không?

Tôi tin rằng tôi phải có một ổ cắm khác cho một khách hàng mới. Nhưng nếu tất cả các chủ đề sử dụng cùng một io_service nó sẽ là song song?

Tôi đã trải qua http://en.highscore.de/cpp/boost/index.html trong phần asio cho biết tôi cần có các io_services khác nhau trong các chuỗi khác nhau để đạt được sự song song.

tôi nếu tôi có kế hoạch để thực hiện một lớp Server tạo ra một new TCPsession mỗi lần một khách hàng mới xuất hiện trong acceptor.async_accept
TCPSession ctor tạo ra một io_servicethread và chạy mà io_service.run() trong chủ đề riêng của mình nó sẽ là một thiết kế tốt ?

Tuy nhiên trong thiết kế này, tôi sẽ tham gia vào tất cả các chủ đề này ở đâu? Tôi có cần một số khác io_service cho main để nó không chấm dứt ngay cả trước khi có một Khách hàng mới không?

Trả lời

8

Single io_service chạy trong một chuỗi đơn lẻ có thể phục vụ tất cả các đối tượng asio trong dự án của bạn. Trong một thiết kế như vậy, i/o vẫn sẽ là "song song" theo nghĩa là nó không bị chặn, không đồng bộ; nhưng kể từ khi io_service::run() đang được chạy trong một chuỗi duy nhất, tất cả các trình xử lý hoàn thành sẽ được gọi theo chuỗi một cách một.

Để mở rộng mô-đun mạng của bạn qua nhiều CPU, bạn có thể sử dụng một trong hai phương pháp: thread-per-core, io_service-per-core - xem HTTPServer2 and HTTPServer3 examples.

Trong mọi trường hợp, việc tạo ra một chủ đề hoặc io_service mỗi TCPSession vẻ như với tôi một chi phí không cần thiết - nghĩ về một trường hợp bạn đã có hàng ngàn TCPSession s ...

+0

Sau đó, những gì mà mỗi chủ đề phiên sẽ làm gì? ví dụ. sao tôi không có một phiên trong một chuỗi? để làm cho mỗi phiên song song? Tuy nhiên, tôi phải có <5 phiên đồng thời cùng một lúc. Mặc dù tôi muốn biết giải pháp mục đích chung –

+0

Không, bạn không cần điều đó. Vui lòng đọc phần sau: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/core/async.html. Trường hợp duy nhất mà bạn có thể cần thêm các chủ đề là nếu các trình xử lý hoàn thành TCPSession quá nặng (ví dụ, thực hiện các thao tác DB tốn thời gian hoặc lâu hơn). Nhưng sau đó ứng dụng của bạn sẽ không thể mở rộng được, vì vậy bạn phải thay đổi thiết kế để tách hoặc di chuyển một số công việc ra khỏi trình xử lý hoàn tất. –

+0

Vì vậy, nếu tôi chỉ có một ổ cắm khác nhau mỗi phiên Nó sẽ không sao? và tôi có thể phát triển toàn bộ vấn đề trong chuỗi đơn đầu tiên không? và sau đó chuyển sang nhiều chủ đề? –