Tùy thuộc vào những gì bạn đang làm, nhưng trong hầu hết các trường hợp, Tùy chọn 1 sẽ có hiệu suất tốt nhất và sẽ dễ dàng thực hiện nhất.
Để cung cấp cho bạn một câu trả lời hoàn chỉnh hơn tôi sẽ cần phải biết những điều sau:
- Are 100 Chủ đề tất cả thực hiện các nhiệm vụ giống nhau không?
- 100 Chủ đề có truy cập cùng một dữ liệu không?
- Các tác vụ được xử lý bởi các chuỗi sẽ có thời gian tự nhiên giảm xuống (chờ quá trình khác hoàn thành hoặc tài nguyên có sẵn)?
- Các tác vụ được xử lý bởi các chuỗi sẽ cố gắng truy cập vào một tài nguyên giới hạn (như đĩa cứng hoặc card mạng)?
- Có thể xử lý bao nhiêu chủ đề đồng thời cùng một lúc (ví dụ bộ xử lý 4 lõi với Hyper-Threading có thể xử lý 8 luồng, bộ xử lý 4 lõi không có Hyper-Threading có thể xử lý 4 luồng)?
- Điều gì sẽ xảy ra nếu xảy ra sự cố trên chuỗi? Quá trình này có bị lỗi hay không, là chuỗi đã khởi động lại chưa?
Nếu tất cả các chủ đề đều thực hiện cùng một tác vụ, việc giữ chúng cùng nhau sẽ dễ dàng hơn cho người dùng cuối và nhà phát triển sau, vì mọi thứ đều ở cùng một nơi.
Nếu tất cả các chủ đề đều truy cập cùng một dữ liệu thì việc lưu giữ chúng trong cùng một quy trình sẽ cho phép bạn chia sẻ dữ liệu giữa các chủ đề (mặc dù xem các điều kiện chủng tộc khi thay đổi dữ liệu) và giảm bộ nhớ chân. Bạn cũng có thể kết hợp các luồng để truy cập dữ liệu từ cùng một khối, vì vậy mọi thứ có thể được lưu trữ trên CPU, giảm hiệu ứng của độ trễ của bộ nhớ, mặc dù đây không phải là điều tôi khuyên bạn nên thử.
Vì nhiều câu trả lời đang đưa ra lời khuyên về cách triển khai dự án của bạn, biết liệu mỗi luồng được thiết kế để sử dụng đầy đủ CPU mọi lúc nó đang chạy hay đây là các tác vụ nền. đi ngủ sẽ giúp chúng tôi đưa ra đề xuất chính xác cho tình huống của bạn.
Biết phần cứng mà quy trình sẽ chạy sẽ giúp chúng tôi cung cấp đề xuất chính xác cho trường hợp của bạn.
Nếu chuỗi không thành công, điều gì sẽ xảy ra? Nếu chuỗi không thành công một lần mỗi ngày, người dùng có cần can thiệp, ngừng quá trình và khởi động lại không? Nếu vậy thì mọi công việc chưa được thực hiện trên các chủ đề khác sẽ bị mất. Trong trường hợp này, việc mỗi thread chạy trong tiến trình riêng của nó sẽ cho bạn lợi ích của việc chỉ mất đi tiến trình thất bại.
Tùy chọn của Christian Hayter 3 có ý nghĩa nhưng không phải lúc nào cũng phù hợp với C#.
Nếu bạn nhìn vào documentation, nó khẳng định:
Một hệ điều hành threadid không có mối quan hệ cố định to a thread quản lý, bởi vì một máy chủ không được quản lý có thể kiểm soát các mối quan hệ giữa các chủ đề quản lý và không được quản lý. Cụ thể, một máy chủ tinh vi có thể sử dụng CLR Hosting API để lên lịch cho nhiều luồng được quản lý dựa trên cùng một luồng hệ điều hành hoặc để di chuyển một chuỗi được quản lý giữa các luồng hệ điều hành khác nhau.
Về cơ bản, điều này có nghĩa là khung .Net sẽ gộp chủ đề của bạn nếu cảm thấy đó là ý tưởng hay. Điều này có nhiều khả năng xảy ra nếu các tiến trình của bạn đang sử dụng nhiều luồng hơn, trong khi tổng số luồng có thể sẽ khá giống nhau giữa các quy trình đa luồng. Kết quả là tôi mong đợi quá trình 1, 100 chủ đề giải pháp để sử dụng tổng số chủ đề ít hơn thì 10 tiến trình, 10 luồng mỗi (một cái gì đó như 10 đến 40, nhưng bạn sẽ phải kiểm tra).
Điều đó đang được nói, khung sẽ được đoán, vì vậy trong một số trường hợp, Thread Pools sẽ là một lựa chọn tốt hơn. Trước tiên, hãy nhớ đọc số documentation vì có một số trường hợp không nên sử dụng Hồ bơi chủ đề. Hướng dẫn nhanh về Bể bơi có thể được tìm thấy trên MSDN. Ngoài ra còn có một số thread sẽ loại bỏ thời điểm sử dụng Thread Pools.
Nếu bạn cung cấp thêm thông tin thì tôi sẽ cố đưa ra câu trả lời chính xác hơn. Nếu không, tùy chọn 1 (và có thể là tùy chọn 3) là lựa chọn tốt hơn trong hầu hết các trường hợp.
3. Không tạo 100 chuỗi hoạt động đồng thời trừ khi bạn đang dùng bút chì với toàn bộ bộ xử lý. –
Các quy trình của bạn có cần giao tiếp không? – Jimmy
Apolagize cho câu trả lời không chính xác (được xóa). Tôi đã thử nghiệm kịch bản trên và tôi thấy quá trình xử lý đa luồng đơn lẻ thực sự nhanh hơn ứng dụng đa tiến trình. Sẽ cố gắng tự mình hiểu lý do. – Jimmy