2010-08-18 28 views

Trả lời

-1

Bạn đã cân nhắc sử dụng một trong các thư viện python mpi như mpi4py? Mặc dù MPI thường được sử dụng để phân phối công việc trên một cụm, nó hoạt động khá tốt trên một máy đa lõi. Nhược điểm là bạn sẽ phải cấu trúc lại mã của bạn để sử dụng các cuộc gọi truyền thông của MPI (có thể dễ dàng).

7

Hãy xem multiprocessing. Đó là một thực tế thường bị bỏ qua mà không chia sẻ dữ liệu trên toàn cầu, và không nhồi nhét các chuỗi chủ đề vào một quy trình duy nhất là những hệ điều hành nào thích.

Nếu bạn vẫn khăng khăng rằng hành vi chuyên sâu CPU của bạn yêu cầu luồng, hãy xem tài liệu dành cho working with the GIL in C. Nó khá thông tin.

+0

Vấn đề lớn nhất mà tôi gặp phải khi cố gắng sử dụng đa xử lý so với luồng là với việc cố gắng chạy 1000+ luồng (quy trình) là bạn nhận được một phiên bản riêng biệt của trình thông dịch Python với mỗi người. Điều này cực kỳ tốn kém về mặt bộ nhớ. – Andy

+0

@nalroff: Điều đó nghe không đúng. Bộ nhớ được sử dụng cho phần lớn người phiên dịch được chia sẻ bởi tất cả các phiên bản của thông dịch viên đó. Chỉ những trang khác nhau sẽ làm tăng tổng dung lượng bộ nhớ. Đảm bảo rằng bạn đang xem đúng giá trị.Nó cũng đáng chú ý rằng các quá trình không sử dụng bộ nhớ nhiều hơn đáng kể so với các chủ đề bổ sung. –

+0

Trong mọi trường hợp tôi đã sử dụng mô-đun đa xử lý trong Python, tôi luôn thấy sự khác biệt đáng kể trong việc sử dụng bộ nhớ giữa các tiến trình và luồng. Dù sao, mô-đun luồng có vẻ đủ nhanh để tìm kiếm trên web luồng và thử nghiệm hiệu suất của một ứng dụng web, đó là tất cả những gì tôi đang sử dụng nó. – Andy

9

Bạn có thể đã phá vỡ chương trình Python thành nhiều quy trình. Hệ điều hành sẽ phân bổ các quy trình của bạn trên tất cả các lõi.

Thực hiện việc này.

python part1.py | python part2.py | python part3.py | ... etc. 

Hệ điều hành sẽ đảm bảo rằng phần sử dụng càng nhiều tài nguyên càng tốt. Bạn có thể truyền thông tin một cách trivially dọc theo đường ống này bằng cách sử dụng cPickle trên sys.stdinsys.stdout.

Nếu không có quá nhiều công việc, điều này thường có thể dẫn đến tăng tốc đáng kể.

Có - với haterz - có thể xây dựng một thuật toán để tra tấn đến mức nó không thể tăng tốc nhiều. Tuy nhiên, điều này thường mang lại lợi ích to lớn cho công việc tối thiểu.

Và.

Việc tái cơ cấu cho mục đích này sẽ chính xác khớp với cấu trúc lại cần thiết để tối đa hóa đồng thời luồng. Vì thế. Bắt đầu với quy trình song song quy trình chia sẻ không có gì cho đến khi bạn có thể chứng minh rằng việc chia sẻ nhiều dữ liệu hơn sẽ giúp ích, sau đó chuyển sang chủ đề song song được chia sẻ-tất cả mọi thứ phức tạp hơn.

1

Đây là cách sử dụng C mở rộng tốt. Từ khóa bạn nên tìm kiếm là Py_BEGIN_ALLOW_THREADS.

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

P.S. Tôi có nghĩa là nếu bạn xử lý đã có trong C, giống như xử lý hình ảnh, sau đó phát hành khóa trong phần mở rộng C là tốt. Nếu mã xử lý của bạn chủ yếu bằng Python, đề xuất của người khác là multiprocessing thì tốt hơn. Nó thường không phải là biện minh để viết lại mã trong C để xử lý nền.

-1

đa xử lý thật dễ dàng. nếu điều đó không đủ nhanh, câu hỏi của bạn sẽ phức tạp.

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