2010-01-12 26 views
30

Ai đó có thể liệt kê một số điểm so sánh giữa Thread Spawning vs Thread Pooling, cái nào tốt hơn? Hãy xem xét .NET framework như là một thực thi tham chiếu hỗ trợ cả hai.Thread Pool vs Thread Spawning

+0

"tốt hơn" phụ thuộc vào nền tảng của bạn – skaffman

Trả lời

21

Một "nhóm" chứa danh sách các "chuỗi" sẵn có sẵn sàng được sử dụng trong khi "sinh sản" đề cập đến việc tạo một chuỗi mới.

Tính hữu dụng của "Thread Pooling" nằm trong "thời gian sử dụng thấp hơn": tránh được thời gian tạo trên thiết bị.

Về mặt "cái nào tốt hơn": tùy theo điều kiện. Nếu thời gian tạo trên không là vấn đề, hãy sử dụng Thread-pooling. Đây là một vấn đề phổ biến trong các môi trường có nhiều "nhiệm vụ ngắn ngủi" cần được thực hiện.


Như được chỉ ra bởi những người khác, có "phí quản lý" cho Thread-Pooling: điều này là tối thiểu nếu được triển khai đúng. Ví dụ. hạn chế số lượng các chủ đề trong hồ bơi là tầm thường.

+1

là có sự khác biệt lớn (về thời gian tiêu thụ) trong việc tạo chuỗi mới so với việc chọn một công việc từ hàng đợi và phân bổ nó đến chuỗi từ một hồ bơi, trên cửa sổ xp Hệ điều hành? – reonze

+0

Tôi chưa thực hiện bất kỳ chương trình Windows nghiêm túc nào trong độ tuổi nhưng tôi chắc chắn rằng việc chọn một chuỗi có sẵn từ danh sách (thao tác đơn giản) rẻ hơn nhiều so với việc tạo ra một chuỗi mới. – jldupont

+2

Tạo ra một chuỗi vật lý mới sẽ có nghĩa là chuyển đổi sang chế độ Kernel và thiết lập một loạt các cấu trúc hạt nhân, vì vậy chi phí sẽ cao hơn. Nhưng như chúng ta đều biết bạn không nên tối ưu hóa sớm.Nếu bạn chỉ tạo một luồng, bạn sẽ không chú ý đến chi phí, nếu bạn đang tạo ra hàng ngàn thì có thể, nhưng thậm chí có thể phụ thuộc vào công việc mà luồng đang làm mà có thể làm thay đổi thời gian tạo chuỗi. –

1

Tùy thuộc vào những gì bạn muốn thực thi trên chuỗi khác.

Đối với nhiệm vụ ngắn, tốt hơn nên sử dụng một nhóm luồng, để làm nhiệm vụ lâu dài có thể tốt hơn để sinh ra một luồng mới vì nó có thể làm hỏng hồ sơ luồng cho các tác vụ khác.

+1

Nó cũng tốt cho phân tích hiệu suất và ghi nhật ký mà bạn có thể đổi tên một luồng sinh sản và do đó làm cho nó dễ dàng cho phân tích hiệu suất - nếu nó là một threadpool nó được khó khăn hơn để đoán mà thread thuộc về nhiệm vụ nào. – weismat

9

Đối với một số định nghĩa "tốt hơn", bạn thường muốn đi với một hồ bơi chuỗi. Nếu không biết trường hợp sử dụng của bạn là gì, hãy xem xét với một nhóm luồng, bạn có một số luồng cố định có thể được tạo khi khởi động hoặc có thể được tạo theo yêu cầu (nhưng số lượng chủ đề không thể vượt quá kích thước của hồ bơi). Nếu một tác vụ được gửi và không có chuỗi nào, nó sẽ được đưa vào hàng đợi cho đến khi có một luồng để xử lý nó.

Nếu bạn là chủ đề sinh sản theo yêu cầu hoặc một số loại trình kích hoạt khác, bạn có nguy cơ làm cạn kiệt tất cả tài nguyên của mình vì không có gì để giới hạn số lượng chuỗi được tạo.

Một lợi ích khác cho việc gộp nhóm là tái sử dụng - các chủ đề giống nhau được sử dụng lặp đi lặp lại để xử lý các tác vụ khác nhau, thay vì phải tạo một chuỗi mới mỗi lần.

Như được chỉ ra bởi những người khác, nếu bạn có một số lượng nhỏ nhiệm vụ sẽ chạy trong một thời gian dài, điều này sẽ phủ nhận lợi ích thu được bằng cách tránh tạo chuỗi thường xuyên (vì bạn không cần phải tạo ra một luồng).

+2

Không có lý do gì khiến bạn không thể giới hạn số lượng chủ đề được sinh ra. –

+1

Đó là sự thật, tôi đã không cho rằng điều đó là không thể. Nhưng sau đó tại sao không sử dụng một hồ bơi? – danben

+0

Vâng, trừ khi 'nói chung' là một nhiệm vụ chạy tương đối dài (bất cứ điều gì trong một vài giây là, thực sự). (Ab) sử dụng threadpool cho hoạt động dài chạy có thể dẫn đến các hình thức khó chịu của deadlocks vv. –

2

Sự khác biệt chính là một ThreadPool duy trì một tập hợp các chủ đề đã được tách ra và sẵn sàng để sử dụng, bởi vì bắt đầu một chuỗi mới có thể tốn kém xử lý khôn ngoan. Tuy nhiên, lưu ý rằng ngay cả một ThreadPool cần phải "đẻ trứng" chủ đề ... nó thường phụ thuộc vào khối lượng công việc - nếu có rất nhiều công việc phải được thực hiện, một threadpool tốt sẽ quay lên chủ đề mới để xử lý tải dựa trên cấu hình và tài nguyên hệ thống.

5

Tất cả phụ thuộc vào kịch bản của bạn. Tạo chủ đề mới là tài nguyên chuyên sâu và một hoạt động tốn kém. Hầu hết các hoạt động không đồng bộ rất ngắn (ít hơn vài giây tối đa) có thể sử dụng hồ bơi luồng.

Đối với các hoạt động đang chạy lâu hơn mà bạn muốn chạy trong nền, bạn thường tạo (sinh đẻ) chuỗi của riêng bạn. (Ab) bằng cách sử dụng một nền tảng thread/thời gian chạy được xây dựng trong threadpool cho hoạt động chạy dài có thể dẫn đến các hình thức khó chịu của deadlocks vv

0

Cần thêm một chút thời gian để tạo/tạo luồng chỉ, khi mà cuộc thăm dò chuỗi đã chứa các chuỗi đã tạo sẵn sàng để sử dụng.

4

Cảm giác của tôi là bạn nên bắt đầu chỉ bằng cách tạo chuỗi nếu cần ... Nếu hiệu suất này là OK thì bạn đã hoàn tất. Nếu tại một số thời điểm, bạn phát hiện rằng bạn cần độ trễ thấp hơn xung quanh việc tạo chuỗi, bạn thường có thể thả vào một nhóm thư mục mà không vi phạm bất cứ điều gì ...

25

Chủ đề của nhóm chủ đề rẻ hơn nhiều so với Đề tài thông thường. cho chủ đề. Nhưng họ có một số hạn chế có thể làm cho họ không thích hợp:

  • Bạn không thể hủy bỏ một sợi threadpool
  • Không có cách nào dễ dàng để phát hiện rằng một threadpool hoàn thành, không Thread.Join()
  • Có không có cách nào dễ dàng để marshal ngoại lệ từ a thread threadpool
  • Bạn không thể hiển thị bất kỳ loại giao diện người dùng trên một sợi threadpool ngoài một hộp thông báo
  • một chủ đề threadpool không nên chạy lâu hơn một vài giây
  • một chủ đề chủ đề hồ bơi không được chặn trong một thời gian dài

Hai ràng buộc sau là tác dụng phụ của bộ lập lịch trình luồng, nó cố gắng giới hạn số lượng chủ động cho số lõi mà CPU của bạn có sẵn. Điều này có thể gây ra sự chậm trễ lâu dài nếu bạn lên lịch cho nhiều chuỗi dài chạy thường xuyên chặn.

Nhiều triển khai poolpool khác có những ràng buộc tương tự, cho hoặc nhận.

+2

Câu trả lời này hoàn toàn là ngôn ngữ/nền tảng cụ thể, nhưng được diễn đạt như thể nó sẽ là một câu trả lời chung. Vì OP không đề cập đến một nền tảng cũng như ngôn ngữ: -1 –

+0

đồng ý với bạn. – Rubyrider

1

Tạo nhóm chủ đề thường được coi là tốt hơn, vì các chuỗi được tạo lên phía trước và được sử dụng theo yêu cầu. Do đó, nếu bạn đang sử dụng rất nhiều luồng cho các tác vụ tương đối ngắn, nó có thể nhanh hơn rất nhiều. Điều này là do chúng được lưu để sử dụng trong tương lai và không bị hủy và sau đó được tạo lại.

Ngược lại, nếu bạn chỉ cần 2-3 chuỗi và chúng sẽ chỉ được tạo một lần, thì điều này sẽ tốt hơn. Điều này là do bạn không đạt được từ bộ nhớ đệm hiện có chủ đề để sử dụng trong tương lai, và bạn không tạo thêm chủ đề mà có thể không được sử dụng.

0

Đối với đa thực hiện ren kết hợp với nhận giá trị trả về từ việc thực hiện, hoặc một cách dễ dàng để phát hiện rằng một threadpool đã hoàn thành, java Callables có thể được sử dụng.

Xem https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6 để biết thêm thông tin.