2010-06-14 38 views
5

Tôi có một câu hỏi thiết kế. Tôi muốn một số thông tin phản hồi để biết nếu một ThreadPool là thích hợp cho chương trình khách hàng tôi đang viết.Câu hỏi thiết kế Threadpool

Tôi đang chạy ứng dụng khách dưới dạng bản ghi cơ sở dữ liệu xử lý dịch vụ. Mỗi bản ghi này chứa thông tin kết nối tới các trang FTP bên ngoài [về cơ bản nó là một hàng đợi các tệp tin để truyền]. Rất nhiều trong số đó là cùng một máy chủ, chỉ di chuyển các tệp khác nhau. Vì vậy, tôi nhóm chúng lại với nhau bằng máy chủ. Tôi muốn có thể tạo một chủ đề mới cho mỗi máy chủ. Tôi thực sự không quan tâm khi quá trình chuyển hoàn thành, họ chỉ cần thực hiện tất cả công việc (hoặc cố gắng làm) họ được chỉ định, và sau đó chấm dứt khi họ hoàn tất, dọn sạch tất cả các tài nguyên mà họ đã sử dụng trong quy trình.

Tôi dự đoán không quá 10-25 kết nối được thiết lập. Khi hàng đợi chuyển bị trống, chương trình sẽ chỉ đợi cho đến khi có các bản ghi trong hàng đợi lần nữa.

ThreadPool có phải là ứng cử viên tốt cho điều này hay tôi nên sử dụng một cách tiếp cận khác?

Chỉnh sửa: Đối với hầu hết các phần, đây là ứng dụng tùy chỉnh quan trọng duy nhất chạy trên máy chủ.

Trả lời

2

Từ những gì bạn đã mô tả, có vẻ như luồng sẽ phù hợp.

vấn đề:

  1. Một chủ đề threadpool sẽ không giữ quá trình của bạn còn sống trên tắt máy. Hãy chắc chắn đó là hành vi bạn muốn.

  2. Đọc sách cũ hơn, buộc lên luồng với các tác vụ chạy dài khi ứng dụng có thể chờ kết nối không tương thích (như ứng dụng web) có thể không tốt. Tuy nhiên, có vẻ như bạn có một dịch vụ cửa sổ chuyên dụng đang chạy, vì vậy tôi không nghĩ rằng đây là một vấn đề.

  3. Chỉ vì bạn ném 10 công việc trong nhóm chủ đề không có nghĩa là nó sẽ ngay lập tức gửi 10 chủ đề để thực hiện công việc - bạn đang ủy quyền quyết định số lượng chủ đề sử dụng cho .net và o/s .

+0

+1 Đồng ý với tất cả các lý do của bạn, threadpool rất phù hợp. – Walter

5

Không, nhóm chủ đề không phù hợp. Các hồ bơi thread thực sự được thiết kế cho "nhiệm vụ ngắn đòi hỏi xử lý nền", kể từ khi khuôn khổ phụ thuộc vào sự sẵn có của chủ đề hồ bơi thread, và các quy trình chạy dài có thể xả hồ bơi thread.

Chuyển khoản Ftp mất một thời gian tương đối dài (thậm chí với thời gian chờ hợp lý), vì vậy chúng không thực sự phù hợp. Bạn có thể có thể nhận bằng cách sử dụng nhóm chủ đề, nhưng bạn cũng có thể thấy mình gặp phải các lỗi không thể giải thích nếu bạn sử dụng nó. Nó phụ thuộc vào bao nhiêu ứng dụng của bạn sử dụng các tính năng khung phụ thuộc nhóm-pool (các đại biểu không đồng bộ, v.v.).

Chủ đề MSDN "The Managed Thread Pool" cung cấp hướng dẫn tốt cho khi không sử dụng thread hồ bơi:

Có một số tình huống trong đó nó là thích hợp để tạo và quản lý chủ đề của riêng bạn thay vì sử dụng chủ đề chủ đề của hồ bơi:

  • Bạn yêu cầu chuỗi tiền cảnh.
  • Bạn yêu cầu chủ đề phải có mức độ ưu tiên cụ thể.
  • Bạn có các tác vụ khiến luồng bị chặn trong một khoảng thời gian dài. Hồ bơi chủ đề có số lượng tối đa là chủ đề, do đó, một số lượng lớn các chủ đề hồ bơi chủ đề bị chặn có thể ngăn chặn các nhiệm vụ bắt đầu.
  • Bạn cần đặt chủ đề vào một căn hộ đơn luồng. Tất cả các chủ đề ThreadPool đều nằm trong số căn hộ đa luồng.
  • Bạn cần có danh tính ổn định được liên kết với chuỗi hoặc để dành một chuỗi cho một tác vụ.
+0

Cảm ơn bạn đã nhập. Bạn có đề nghị tôi chỉ tạo Chủ đề và tự quản lý chúng không? –

+0

Thật vậy, việc tạo ra các chủ đề và tự quản lý chúng là cách để đi trong dài hạn. Chi phí của các chủ đề kéo sợi sẽ không đáng kể so với thời gian chuyển giao FTP, điều này khắc phục một trong những lợi ích chính của việc gộp nhóm (phần còn lại là giao diện đơn giản 'QueueUserWorkItem' cung cấp). –

1

Một ThreadPool sẽ được tốt đẹp vì nó cho phép bạn tập trung vào việc thiết lập các công việc xếp hàng đợi đến chủ đề, thay vì lo lắng về khởi tạo và làm sạch chủ đề cá nhân.

Nhưng bạn muốn điều này hoạt động như thế nào? Bạn sẽ xếp hàng nhiều công việc vào hồ bơi cho một máy chủ, hoặc bạn sẽ có một chủ đề cho mỗi máy chủ lưu trữ mà đọc công việc từ hàng đợi của riêng mình?

+0

Có một bảng cơ sở dữ liệu duy nhất cho hàng đợi và có một cột theo tên máy. Dịch vụ máy khách sẽ truy vấn bằng tên máy riêng của nó. Sau đó, từ tập con của các bản ghi (hãy nói 100 bản ghi được trả về), nó sẽ được nhóm theo máy chủ (giả sử nó trả về 4 máy chủ duy nhất trong số 100 bản ghi). Vì vậy, tôi muốn có 4 chủ đề trong hồ bơi bắt đầu cho mỗi máy chủ đó. –

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