Chào mừng thế giới lập trình đồng thời.
Điều mà Python có thể (và không thể) phụ thuộc vào hai điều.
Hệ điều hành có thể (và không thể) làm. Hầu hết các hệ điều hành phân bổ các quy trình cho lõi. Để sử dụng 4 lõi, bạn cần phải giải quyết vấn đề của mình thành bốn quy trình. Điều này dễ hơn âm thanh. Đôi khi.
Thư viện C cơ bản có thể (và không thể) làm. Nếu các thư viện C phơi bày các tính năng của hệ điều hành và hệ điều hành cho thấy các tính năng của phần cứng, bạn chắc chắn.
Để giải quyết vấn đề thành nhiều quy trình - đặc biệt trong GNU/Linux - thật dễ dàng. Chia nó thành một đường ống đa bước.
Trong trường hợp tổng hợp một triệu số, hãy nghĩ về tập lệnh trình bao sau. Giả sử một số chương trình giả thuyết sum.py
tổng hợp một loạt các số hoặc danh sách các số trên stdin.
(sum.py 0 500000 & sum.py 50000 1000000) | sum.py
Điều này sẽ có 3 quy trình đồng thời. Hai là làm tổng của rất nhiều con số, thứ ba là tổng hợp hai con số.
Vì vỏ GNU/Linux và hệ điều hành đã xử lý một số phần đồng thời cho bạn, bạn có thể thiết kế các chương trình đơn giản (rất, rất đơn giản) đọc từ stdin, viết thành stdout và được thiết kế để thực hiện các phần nhỏ một công việc lớn.
Bạn có thể thử giảm chi phí bằng cách sử dụng subprocess để tạo đường ống thay vì phân bổ công việc cho trình bao. Tuy nhiên, bạn có thể thấy rằng vỏ xây dựng đường ống rất, rất nhanh. (. Nó được viết trực tiếp trong C và làm cho các cuộc gọi hệ điều hành API trực tiếp cho bạn)
Nguồn
2009-07-25 15:45:49
@Martin, tôi tin rằng những bế tắc này, theo http://docs.python.org/library/multiprocessing.html#multiprocessing-programming: "một quá trình đã đặt các mục vào một hàng đợi sẽ đợi trước khi chấm dứt cho đến khi tất cả các mục đệm được nạp bởi luồng "feeder" vào đường ống bên dưới "- ví dụ về bế tắc mà tài liệu cung cấp rất giống với mã của bạn (đó là một tiến trình con duy nhất trong phần bắt đầu, tham gia, nhận trình tự) và hai quy trình con thay vì một quy trình không hữu ích. Hoán đổi các kết nối và nhận hoặc chỉ xóa các kết nối. –
"Nó làm việc cho tôi", có lẽ vì dữ liệu chỉ đơn giản là phù hợp với đường ống. Trong mọi trường hợp, tôi đã xóa các kết nối. –
Bạn có đang chạy trên Linux không? – Nope