Nếu tất cả các chủ đề/quy trình của bạn thực sự là CPU bị ràng buộc, bạn nên chạy nhiều quá trình như CPU báo cáo lõi. Do HyperThreading, mỗi lõi CPU vật lý có thể trình bày nhiều lõi ảo. Gọi số multiprocessing.cpu_count
để lấy số lõi ảo.
Nếu chỉ p trong số 1 chủ đề của bạn là CPU bị ràng buộc, bạn có thể điều chỉnh số đó bằng cách nhân với p. Ví dụ: nếu một nửa quy trình của bạn là CPU bị ràng buộc (p = 0.5) và bạn có hai CPU với 4 lõi mỗi và 2x Siêu phân luồng, bạn nên bắt đầu quá trình 0.5 * 2 * 4 * 2 = 8.
Nếu bạn có quá ít quá trình, ứng dụng của bạn sẽ chạy chậm hơn mong đợi. Nếu ứng dụng của bạn có quy mô hoàn hảo và chỉ bị ràng buộc CPU (tức là nhanh gấp 10 lần khi được thực hiện gấp 10 lần số lượng lõi), điều này có nghĩa là tốc độ của bạn chậm hơn. Ví dụ: nếu hệ thống của bạn gọi 8 quy trình, nhưng bạn chỉ bắt đầu 4, bạn sẽ chỉ sử dụng một nửa dung lượng xử lý và mất gấp đôi thời gian. Lưu ý rằng trong thực tế, không có quy mô ứng dụng nào hoàn hảo, nhưng một số ứng dụng (theo dõi tia, mã hóa video) khá gần.
Nếu bạn có quá nhiều quy trình, phí đồng bộ hóa sẽ tăng lên. Nếu chương trình của bạn có ít hoặc không có phí đồng bộ hóa, điều này sẽ không ảnh hưởng đến thời gian chạy tổng thể, nhưng có thể làm cho các chương trình khác xuất hiện chậm hơn chúng trừ khi bạn đặt các quy trình của mình thành mức ưu tiên thấp hơn. Số lượng quá trình xử lý quá mức (giả sử là 10000) là hợp lý nếu hệ điều hành của bạn có trình lên lịch tốt. Trong thực tế, hầu như bất kỳ đồng bộ hóa nào cũng sẽ khiến cho chi phí không thể chịu nổi.
Nếu bạn không chắc chắn liệu ứng dụng của bạn có bị ràng buộc CPU và/hoặc mở rộng quy mô hoàn toàn hay không, chỉ cần quan sát tải hệ thống với số lượng chuỗi khác nhau. Bạn muốn tải hệ thống xuống dưới 100%, hoặc chính xác hơn uptime là số lõi ảo.
Cảm ơn câu trả lời tuyệt vời. Không biết tất cả điều đó. Điều gì sẽ xảy ra nếu có một số phần không bị ràng buộc trong CPU trong ứng dụng. Ví dụ, rất nhiều tính toán cpu, nhưng sau đó kết quả cuối cùng được lưu vào tập tin hoặc cơ sở dữ liệu. Điều đó có nghĩa là tôi nên tạo ra nhiều quy trình hơn vì một số phải đợi mạng cuối cùng (cơ sở dữ liệu) hoặc ghi đĩa (ghi tệp)? – Lostsoul
@Lostsoul Nói chung, có nếu chia sẻ hoạt động ràng buộc đĩa là quan trọng. Nếu bạn đang viết một tập tin tóm tắt ngắn (nói, hình ảnh sau khi chiếu một cảnh phức tạp), hiệu ứng này là không đáng kể.Nếu ứng dụng của bạn đọc và ghi nhiều dữ liệu, bạn thực sự cần tăng số lượng quy trình. Đã cập nhật câu trả lời bằng một đoạn: Nếu bạn không chắc chắn, hãy thử nó! – phihag
Chỉ cần thêm vào phần quan sát: bạn rõ ràng là muốn tránh việc sử dụng CPU ngày càng tăng vì chi phí đồng bộ hóa. Vì vậy, khi thực hiện thử nghiệm, bạn nên đo cả tải hệ thống và thông lượng ứng dụng của bạn. – millimoose