Tôi muốn chạy một chương trình chuyên sâu CPU trong Python trên nhiều lõi và đang cố gắng tìm ra cách để viết phần mở rộng C để làm điều này. Có bất kỳ mẫu mã hoặc hướng dẫn về điều này?Làm thế nào để sử dụng phần mở rộng C trong python để có được xung quanh GIL
Trả lời
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).
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.
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.stdin
và sys.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.
Đâ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.
đ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.
- 1. Làm thế nào để tránh cảnh báo gcc trong phần mở rộng Python C khi sử dụng Py_BEGIN_ALLOW_THREADS
- 2. Làm thế nào để nhận được xung quanh cảnh báo "rvalue được sử dụng như lvalue"?
- 3. Làm thế nào để có được xung quanh một lỗi 'NS_ERROR_ILLEGAL_VALUE' bằng cách sử dụng Ajax?
- 4. Làm thế nào để thoát khỏi các phần mở rộng từ file basename sử dụng python
- 5. Làm thế nào để có được đầu của bạn xung quanh C + + liên kết/phụ thuộc?
- 6. trong phần mở rộng Python C
- 7. Làm thế nào để vượt qua std :: unique_ptr xung quanh?
- 8. Làm thế nào để mở rộng một lớp trong python?
- 9. Làm thế nào để có được dữ liệu bài trong phần mở rộng chrome
- 10. Làm thế nào để bọc văn bản xung quanh các thành phần trong một JTextPane?
- 11. Làm thế nào để tạo viền trắng xung quanh bitmap?
- 12. Làm thế nào để có được xung quanh thiếu hiệp phương sai với IReadOnlyDictionary?
- 13. Làm thế nào để loại bỏ phần dư thừa xung quanh Nút?
- 14. Làm thế nào để cài đặt phần mở rộng ITL
- 15. Python: GIL context - switching
- 16. Làm thế nào để xoay đối tượng xung quanh một điểm bằng cách sử dụng quaternions?
- 17. Làm thế nào để thực hiện pluralize & phần mở rộng khác sử dụng play framework 2.0
- 18. Đóng gói các đối tượng để mở rộng/thêm chức năng trong khi làm việc xung quanh isinstance
- 19. Tôi có thể sử dụng valgrind với các phần mở rộng của Python C++ như thế nào?
- 20. Làm thế nào để chạy C# Desktop Application với phần mở rộng .exe trong Mac OSX?
- 21. Chuyển một con trỏ C xung quanh bằng Python/C API
- 22. Regex để có được phần mở rộng tập tin
- 23. Làm thế nào để chuyển hướng phần mở rộng html bằng cách sử dụng htaccess?
- 24. Làm thế nào để bọc DrawerLayout xung quanh PreferenceActivity trong một ứng dụng Android?
- 25. Làm thế nào để mở rộng Python lớp init
- 26. Làm thế nào để Lazy <T> nhận được xung quanh cần ràng buộc mới()?
- 27. Làm thế nào để tạo một loại ngoại lệ Python tùy chỉnh trong phần mở rộng C?
- 28. đèo python danh sách để C++ mở rộng việc sử dụng tăng python
- 29. Có thể DLL trong .NET sử dụng một phần mở rộng khác, ví dụ: MLL?
- 30. làm thế nào để làm xoay vòng 3D xung quanh trung tâm trong AS3 sử dụng matrix3D?
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
@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. –
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