2012-02-29 44 views
19

Từ những gì tôi hiểu về sự khác biệt giữa Tác vụ & Chủ đề là nhiệm vụ đó đã xảy ra trong nhóm chủ đề trong khi chuỗi là thứ tôi cần quản lý. (và nhiệm vụ đó có thể được hủy bỏ và quay trở lại thread-pool khi kết thúc nhiệm vụ của mình)Sự khác biệt giữa Tác vụ (System.Threading.Task) và Chủ đề

Nhưng trong một số blog, tôi đọc rằng nếu hệ điều hành cần tạo nhiệm vụ và tạo thread => nó sẽ dễ dàng hơn để tạo (và tiêu diệt) nhiệm vụ.

Ai đó có thể giải thích tại sao việc tạo nhiệm vụ đơn giản là chủ đề đó?

(hoặc có thể tôi thiếu gì đó ở đây ...)

+17

Sự khác nhau giữa * công việc * và * công nhân * là gì? Một công nhân * làm * một công việc; một công nhân không phải là * một công việc *. Một số công việc được thực hiện bởi một công nhân; một số công việc được chia thành các công việc nhỏ hơn được thực hiện bởi nhiều công nhân làm việc cùng nhau. Cùng với nhiệm vụ và chủ đề; một nhiệm vụ không phải là * một loại luồng *; một công việc là một công việc, và một sợi chỉ là một công nhân làm công việc đó. –

+3

Một điểm tương tự khác mà tôi đã nghe là bộ vi xử lý là các trình điều khiển, các luồng là các xe tải và các nhiệm vụ được tải xuống. Một người lái xe (bộ vi xử lý) chỉ có thể vận hành một xe tải (sợi) tại một thời điểm, và một chiếc xe tải (sợi) chỉ có thể chở một tải (nhiệm vụ) tại một thời điểm. Bạn có thể mua bao nhiêu xe tải theo ý muốn, nhưng càng có nhiều thời gian để người lái xe chuyển đổi giữa các xe tải ít tốn thời gian hơn.Tải trọng có thể được chất đống trong một nhà kho chờ đợi cho giao thông vận tải, và các nhà kho có thể ưu tiên cho họ và gán chúng cho xe tải dựa trên bất kỳ quy tắc có ý nghĩa. –

Trả lời

20

tôi nghĩ rằng những gì bạn đang nói về khi bạn nói công tác là một System.Threading.Task. Nếu trường hợp đó xảy ra thì bạn có thể nghĩ về điều này theo cách này:

  • Một chương trình có thể có nhiều luồng, nhưng lõi bộ xử lý chỉ có thể chạy một Thread cùng một lúc.
    • Chủ đề là rất đắt tiền, và chuyển đổi giữa các chủ đề đang chạy cũng rất tốn kém.
    • Vì vậy ... Có hàng nghìn chủ đề hoạt động không hiệu quả. Hãy tưởng tượng nếu giáo viên của bạn tặng bạn 10.000 công việc cần làm. Bạn đã dành rất nhiều thời gian đi xe đạp giữa họ mà bạn sẽ không bao giờ làm được gì. Điều tương tự cũng có thể xảy ra với CPU nếu bạn bắt đầu quá nhiều luồng.

Để giải quyết vấn đề này, .NET framework cho phép bạn tạo Công việc. Nhiệm vụ là một chút công việc được sắp xếp thành một đối tượng và chúng cho phép bạn thực hiện những điều thú vị như chụp đầu ra của tác phẩm đó và chuỗi tác phẩm cùng nhau (trước tiên chuyển đến cửa hàng, rồi mua mua tạp chí).

Nhiệm vụ được lên lịch trên một nhóm chủ đề.Số lượng chủ đề cụ thể tùy thuộc vào lịch trình được sử dụng, nhưng trình lên lịch mặc định cố gắng chọn một số chuỗi tối ưu cho số lõi CPU mà bạn có và thời gian thực hiện nhiệm vụ của bạn bằng cách sử dụng thời gian CPU. Nếu bạn muốn, bạn thậm chí có thể viết lịch trình của riêng bạn mà làm một cái gì đó cụ thể như đảm bảo rằng tất cả các nhiệm vụ cho rằng lịch trình luôn luôn hoạt động trên một sợi duy nhất.

Vì vậy, hãy nghĩ về Nhiệm vụ là các mục trong danh sách việc cần làm của bạn. Bạn có thể làm 5 việc cùng một lúc, nhưng nếu sếp của bạn cung cấp cho bạn 10000, họ sẽ tích lũy trong hộp thư đến của bạn cho đến 5 người đầu tiên mà bạn đang thực hiện. Sự khác biệt giữa Task và ThreadPool là Tasks (như tôi đã đề cập trước đó) cho phép bạn kiểm soát tốt hơn mối quan hệ giữa các mục khác nhau của công việc (tưởng tượng các mục cần làm với nhiều hướng dẫn cùng nhau), trong khi ThreadPool chỉ cho phép bạn xếp hàng một loạt các mục riêng lẻ, một tầng (Chức năng).

+3

'Nhiệm vụ được lên lịch trên' ThreadPool' theo mặc định, nhưng chúng không nhất thiết phải như vậy. Thậm chí có thể không có bất kỳ mã nào được liên kết trực tiếp với 'Task', nếu bạn tạo nó bằng cách sử dụng' TaskCompletionSource'. – svick

11

Bạn đang nghe hai khái niệm khác nhau về tác vụ. Đầu tiên là khái niệm về một công việc, và thứ hai là khái niệm của một quá trình.

Một thời gian dài trước đây (về mặt máy tính), không có chủ đề nào. Mỗi thể hiện của một chương trình được gọi là một quá trình, vì nó chỉ đơn giản là thực hiện một bước sau cái khác cho đến khi nó thoát ra. Điều này phù hợp với ý tưởng trực quan của một quá trình như một loạt các bước, giống như của một dây chuyền lắp ráp nhà máy. Hệ điều hành quản lý quá trình trừu tượng hóa.

Sau đó, nhà phát triển bắt đầu thêm nhiều dây chuyền lắp ráp cho các nhà máy. Bây giờ một chương trình có thể làm nhiều hơn một điều cùng một lúc, và hoặc là một thư viện hoặc (thường ngày nay) hệ điều hành sẽ quản lý việc lập lịch trình các bước trong mỗi luồng. Một luồng chỉ là một quá trình nhẹ, nhưng một luồng thuộc về một tiến trình và tất cả các luồng trong một bộ nhớ chia sẻ quy trình. Mặt khác, nhiều quy trình không thể gây rối với bộ nhớ của nhau. Vì vậy, nhiều chủ đề trong máy chủ web của bạn có thể truy cập cùng một thông tin về kết nối, nhưng Word không thể truy cập cấu trúc dữ liệu trong bộ nhớ của Excel vì Word và Excel đang chạy dưới dạng các quy trình riêng biệt. Ý tưởng về một quá trình như một loạt các bước không thực sự phù hợp với mô hình của một quá trình với các luồng, vì vậy một số người đã gọi đến "trừu tượng trước đây được gọi là một quá trình" một nhiệm vụ. Đây là định nghĩa thứ hai của tác vụ mà bạn đã thấy trong bài đăng trên blog. Lưu ý rằng nhiều người vẫn sử dụng quá trình từ để có nghĩa là điều này.

Vâng, khi các chủ đề trở nên nhiều hơn, các nhà phát triển đã thêm nhiều phần trừu tượng hơn trên đầu chúng để làm cho chúng dễ sử dụng hơn. Điều này dẫn đến sự gia tăng của hồ bơi thread, mà là một "hồ bơi" quản lý thư viện của chủ đề. Bạn vượt qua thư viện một công việc và thư viện chọn một chuỗi và chạy công việc trên chuỗi đó. Khuôn khổ .NET có triển khai pool thread, và lần đầu tiên bạn nghe về một "nhiệm vụ", tài liệu thực sự có nghĩa là một công việc mà bạn chuyển đến pool thread.

Vì vậy, theo nghĩa nào đó, cả tài liệu và bài đăng trên blog đều đúng. Việc quá tải nhiệm vụ nhiệm vụ là nguồn gây nhầm lẫn không may.

+1

+1 đây là một lời giải thích tốt đẹp. Tôi nghĩ rằng OP đang nói về 'System.Threading.Task'. Sẽ tốt hơn nếu bạn có thể mở rộng cuộc thảo luận nhiều hơn một chút để bao gồm các sắc thái của TPL. –

2

Công việc thực sự chỉ là trình bao bọc cho mã bản mẫu của các chủ đề quay lên theo cách thủ công. Tại gốc, không có sự khác biệt. Nhiệm vụ chỉ làm cho việc quản lý các chủ đề dễ dàng hơn, cũng như chúng thường mang tính biểu cảm hơn do sự giảm tiếng ồn của bản mẫu.

+0

Chris, Bạn có thể giải thích về Nhiệm vụ được lên lịch không? – Yanshof

+1

Tôi sẽ thêm một câu trả lời, nhưng tôi cũng sẽ hướng dẫn bạn đến câu trả lời của @ AdamMihalcin –

+0

@ChrisShain Tôi đồng ý rằng các Tác vụ được lên lịch trên các chủ đề và không cố ý ngụ ý rằng các chủ đề giống như Nhiệm vụ, nhưng các mục tiêu phát triển tương tự được hoàn thành. Có lẽ lời giải thích của tôi hơi quá chung chung ... –

8

Chủ đề là một phần của .Net từ v1.0, Các tác vụ đã được giới thiệu trong Thư viện công việc song song TPL được phát hành trong .Net 4.0.

Bạn có thể xem Tác vụ là phiên bản chủ đề phức tạp hơn. Chúng rất dễ sử dụng và có nhiều ưu điểm hơn Chủ đề như sau:

  1. Bạn có thể tạo kiểu trả về cho Công việc như thể chúng là hàm.
  2. Bạn có thể sử dụng phương thức "ContinueWith", sẽ đợi tác vụ trước đó và sau đó bắt đầu thực hiện. (Tóm tắt chờ)
  3. Tóm tắt Khóa cần tránh theo hướng dẫn của công ty tôi.
  4. Bạn có thể sử dụng Task.WaitAll và chuyển một loạt tác vụ để bạn có thể đợi cho đến khi tất cả các tác vụ hoàn tất.
  5. Bạn có thể đính kèm tác vụ vào tác vụ gốc, do đó bạn có thể quyết định liệu cha mẹ hoặc đứa trẻ có tồn tại trước không.
  6. Bạn có thể đạt được dữ liệu song song với các truy vấn LINQ.
  7. Bạn có thể tạo song song cho và foreach vòng
  8. Rất dễ dàng để xử lý ngoại lệ với các tác vụ.
  9. * Điều quan trọng nhất là nếu cùng một mã được chạy trên máy lõi đơn, nó sẽ chỉ hoạt động như một quá trình đơn lẻ mà không cần phải trả phí.

Nhược điểm của nhiệm vụ trên chủ đề:

  1. Bạn cần Net 4,0
  2. Người mới đến những người đã học hệ điều hành có thể hiểu bài tốt hơn.
  3. Mới trong khuôn khổ nên không có nhiều hỗ trợ.

Một số mẹo: - Luôn sử dụng phương thức Task.Factory.StartChính sách hoàn hảo về ngữ nghĩa và tiêu chuẩn.

Hãy nhìn vào tác vụ song song Libray để biết thêm thông tin http://msdn.microsoft.com/en-us/library/dd460717.aspx

3

Mở rộng trên những nhận xét của Eric Lippert:

Thread s là một cách cho phép ứng dụng của bạn để làm một vài điều song song. Ví dụ: ứng dụng của bạn có thể có một luồng xử lý các sự kiện từ người dùng, như các lần nhấp nút và một chuỗi khác thực hiện một số tính toán dài. Bằng cách này, bạn có thể làm hai việc khác nhau “cùng một lúc”. Nếu bạn không làm điều đó, người dùng sẽ không nhấp vào nút cho đến khi tính toán kết thúc. Vì vậy, Thread là thứ có thể thực thi một số mã bạn đã viết.

Task, mặt khác thể hiện khái niệm trừu tượng về một số công việc. Công việc đó có thể có kết quả, và bạn có thể đợi cho đến khi công việc kết thúc (bằng cách gọi Wait()) hoặc nói rằng bạn muốn làm điều gì đó sau khi công việc kết thúc (bằng cách gọi ContinueWith()).

Công việc phổ biến nhất mà bạn muốn đại diện là thực hiện một số tính toán song song với mã hiện tại. Và Task cung cấp cho bạn một cách đơn giản để thực hiện điều đó. Làm thế nào và khi mã thực sự chạy được xác định bởi TaskScheduler. Trình mặc định sử dụng ThreadPool: một tập hợp các chuỗi có thể chạy bất kỳ mã nào. Điều này được thực hiện bởi vì việc tạo và chuyển đổi các luồng không hiệu quả.

Nhưng Task không phải liên kết trực tiếp với một số mã. Bạn có thể sử dụng TaskCompletionSource để tạo một Task và sau đó đặt kết quả của nó bất cứ khi nào bạn muốn. Ví dụ: bạn có thể tạo Task và đánh dấu là hoàn thành khi người dùng nhấp vào nút. Một số mã khác có thể đợi trên Task và trong khi chờ đợi, không có mã thực thi cho số Task.

Nếu bạn muốn biết khi nào sử dụng Task và khi nào sử dụng Thread: Task là đơn giản để sử dụng và hiệu quả hơn mà tạo của riêng bạn Thread s. Nhưng đôi khi, bạn cần kiểm soát nhiều hơn những gì được cung cấp bởi Task. Trong những trường hợp đó, bạn nên sử dụng trực tiếp số Thread.

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