2009-03-18 25 views
23

Tôi đã được thông báo rằng ASP.NET được đa luồng theo mặc định trong IIS. Làm thế nào là luồng này đạt được?ASP.NET đa luồng như thế nào?

Trang chủ máy chủ có gửi các yêu cầu khác nhau đến các lõi khác nhau không?

Có một yêu cầu nào sử dụng nhiều lõi không?

Quan trọng hơn, có lợi thế nào khi thêm luồng vào mã ASP.NET nếu luồng được thực hiện cao hơn trong IIS không?

+3

Bất kỳ trang web bằng cách thiết kế là đa luồng, mỗi yêu cầu được phục vụ lên phần lớn song song với tất cả các yêu cầu khác –

Trả lời

5

IIS sử dụng nhiều lõi tự động (alt bạn có thể tắt nó nếu bạn chọn).

Lợi thế để thêm chuỗi vào mã ASP.NET là để bạn có thể kiểm soát hoạt động bên trong của ứng dụng của riêng bạn và không bị buộc phải dựa vào IIS để đưa ra quyết định cho bạn.

+0

Đó là một lợi thế mơ hồ –

+0

Đặt câu hỏi mơ hồ, nhận được câu trả lời mơ hồ. Câu trả lời chính xác duy nhất có thể cho câu cuối cùng trong bốn câu hỏi ban đầu là "nó phụ thuộc." –

3

Một luồng riêng biệt thường được sinh ra cho mỗi yêu cầu mới, sau đó hệ điều hành lập lịch trình bộ xử lý. Trừ khi bạn cần phải xử lý chỉ một vài yêu cầu tại một thời điểm bạn không cần thêm luồng.

+0

Câu trả lời của bạn cho thấy rằng một yêu cầu sẽ ở trên cùng một luồng cho toàn bộ cuộc sống của nó, điều này không đúng (và giả định đó có thể gây ra vấn đề nếu bạn sử dụng thống kê luồng). –

+0

Vâng, chúng tôi không bao giờ phát triển các chương trình nhận biết về sự nhanh nhẹn của luồng, vì vậy tôi không có ý tưởng về điều này trước đây. – sharptooth

+0

IIS không cũng sử dụng một hồ bơi thread? Afaik nó sinh ra các luồng khi khởi động, sau đó tái sử dụng chúng giữa các yêu cầu. – Mendelt

23

Máy chủ không chỉ yêu cầu các yêu cầu khác nhau cho các chủ đề khác nhau, nhưng một yêu cầu duy nhất có thể thay đổi luồng trong suốt vòng đời. Đây được gọi là sự nhanh nhẹn của chủ đề. Tôi đang tìm kiếm một bài viết hay giải thích về nó ...

CHỈNH SỬA: Chưa có bài viết chính xác nào, nhưng one blog post giải thích một số khó khăn.

EDIT: Thêm liên kết từ nhận xét:

+1

Nhưng một yêu cầu không chạy ở nhiều hơn một luồng tại một thời điểm nhất định, do đó, vào cuối ngày, toàn bộ yêu cầu xử lý có thể được xem như một luồng đơn. (Hay không?) – Tomalak

+1

@Tomalak: Không, nó không thể được coi là đơn luồng, bởi vì nó có thể thay đổi chủ đề. Điều đó có nghĩa là nếu bạn gắn kết mọi thứ vào một biến [ThreadStatic] khi bắt đầu yêu cầu, nó có thể không có ở cuối yêu cầu. –

+0

@ Jon Tôi đoán điều này làm phức tạp ý tưởng sinh ra các chủ đề khác từ bên trong một yêu cầu hơn nữa, phải không? – sharptooth

8

ASP.net sử dụng .Net threadpool (có thể cấu hình) Mỗi yêu cầu được nhận bởi một trong các chủ đề trong threadpool, cho đến khi mỗi luồng đã được chiếm. Sau đó yêu cầu hàng đợi tại ngăn xếp IIS, cho đến khi điều này cũng tràn qua. Từ đó các yêu cầu mới được đáp ứng với thông báo 'Máy chủ không khả dụng' rất xấu.

Đây là câu chuyện 'đa luồng' thông thường cho trang web ASP.net.

Có nhiều cách để đảm bảo khả năng mở rộng. Kiểm tra hiệu suất rõ ràng nhất và loại bỏ tắc nghẽn từ mã của bạn.

ASP.net thực sự có thể tận dụng nhiều lõi bằng cách sử dụng các luồng I/O cho bất kỳ yêu cầu I/O nào. Nó làm cho mã xấu xí nhưng nhanh chưa bao giờ được đẹp.

Đây là MSDN MAG dứt khoát bài về cách để làm điều này

CẬP NHẬT

Vâng tôi có lẽ cố gắng trả lời câu hỏi đầy đủ của bạn:

"Quan trọng hơn là có bất kỳ lợi thế để thêm chủ đề vào mã ASP.Net nếu luồng được thực hiện cao hơn ở mứctrong IIS? "

Câu trả lời ngắn gọn là: Phụ thuộc! Nếu bạn đang chờ đợi một quy trình chạy dài, bạn nên thực hiện một trải nghiệm đẹp hơn cho khách hàng yêu cầu (ví dụ: Gọi điện ngoài AJAX)

nếu bạn có nhiều nhiệm vụ độc lập cần hoàn thành khách hàng yêu cầu: sau đó bạn có thể tốt hơn để tạo ra một quy trình mới để chạy các tác vụ song song.

Nếu trang web của bạn nhận được rất nhiều giao thông, sau đó bạn thực sự cần phải xem xét thực hiện mô hình đồng bộ để sử dụng tốt hơn CPU của bạn