Gần đây tôi nhận thấy rằng python chỉ sử dụng một lõi tại một thời điểm để làm việc. Có cách nào, có thể là các bản dựng hoặc lệnh đặc biệt, để làm cho nó sử dụng tất cả các tài nguyên (lõi thứ hai) không?
Gần đây tôi nhận thấy rằng python chỉ sử dụng một lõi tại một thời điểm để làm việc. Có cách nào, có thể là các bản dựng hoặc lệnh đặc biệt, để làm cho nó sử dụng tất cả các tài nguyên (lõi thứ hai) không?
Câu trả lời:
Bạn có thể sử dụng các quy trình con để tận dụng nhiều lõi trong tập lệnh Python, để một số tác vụ có thể chạy song song. Nhưng bạn không thể phân chia một nhiệm vụ duy nhất trên một số lõi. Xem giải thích chi tiết trong Câu hỏi thường gặp này: ArcGIS 10 có hỗ trợ bộ xử lý đa lõi và / hoặc Hệ điều hành 64 bit không?
Nếu bạn là người dùng Python dày dạn, bạn có thể quan tâm đến cách tiếp cận được giải thích trong bài trình bày của người dùng này từ Dev Summit 2014, được gọi là Xử lý địa lý song song bằng cách sử dụng phương pháp xử lý đa hướng và quan trọng của Python , nhưng nó sẽ không cho phép bạn sử dụng một số lõi cho cùng một nhiệm vụ.
Nếu không, bạn sẽ phải chờ phát hành ArcGIS Pro (ứng dụng hoàn toàn 64 bit) vào cuối năm nay để kiểm tra cách đa luồng hoạt động ... (hoặc thử bản Beta ngay bây giờ)
Như một số đề cập, không có hỗ trợ cho đa xử lý trong ArcGIS Desktop. Khi nói về việc xử lý bộ dữ liệu GIS trong môi trường máy tính để bàn, tôi đang cố gắng tìm hiểu xem liệu tôi có thể chia một luồng công việc lớn thành các phần nhỏ hơn sẽ được tính toán cùng lúc tải nhiều lõi hay không. Hầu hết mọi trường hợp nên được điều tra riêng vì các hành vi của công cụ GP có thể khác nhau đáng kể.
Hãy nghĩ những gì nhanh hơn để làm khi giải một bài toán đơn giản. Cách nhanh nhất để đếm tất cả các số từ 1 đến 100 là gì?
1) bằng cách tính tổng các kết quả từng cái một và cộng tổng với nhau tăng dần (1 + 2 = 3, 3 + 3 = 6,6 + 4 = 10, v.v.). Một cốt lõi đang làm việc trên nhiệm vụ này.
2) phân chia các giá trị trước thành các khối riêng lẻ và tính tổng các giá trị ở đó trước (1 đến 30, 31 đến 60 và 60 đến 100). Ba lõi sẽ hoạt động cùng một lúc (bước cuối cùng sẽ là tổng ba giá trị nhận được).
Vì các công cụ GP khác nhau là các triển khai của các thuật toán khác nhau với ký hiệu O lớn khác nhau , có lẽ bạn sẽ cần phải tiếp cận chúng theo cách khác nhau trong việc gửi nhiều quy trình.
Một điểm khởi đầu tốt sẽ là tìm hiểu cách thư viện đa xử lý trong Python hoạt động. Tôi sử dụng khá nhiều.
Tôi cũng nhận thấy rằng việc chạy các tập lệnh Python từ một dòng lệnh bằng cách sử dụng Python 64 bit thường dẫn đến việc chạy nhanh hơn (so với việc chạy IDE, nhưng điều này có thể không xảy ra trên máy của bạn). Xử lý địa lý nền đã được giới thiệu trong 10.1, nhưng hãy thử chạy các kịch bản Python với Python 64 bit và xem hiệu suất đang bị ảnh hưởng như thế nào.
ArcGIS Pro có tên trong một câu trả lời khác có sẵn trong phiên bản beta 5 để tải xuống (xin lưu ý rằng bạn cần phải là người tham gia Cộng đồng Esri Beta để gửi bất kỳ lỗi nào và có quyền truy cập vào tài khoản ArcGIS Online cho Tổ chức để có thể chạy bản Pro).
Pypy là phiên bản tương thích của python chạy nhanh hơn 4-5 lần so với CPython (python "tiêu chuẩn").
Nếu bạn đủ can đảm để xây dựng nó từ nguồn, có một nhánh "có thể chạy nhiều luồng đói CPU độc lập trong cùng một quy trình." Điều này có nghĩa là bạn có được những lợi ích của đa luồng mà không phải viết lại bất kỳ mã nào.
Câu trả lời đơn giản là không. Câu trả lời tốt hơn là nó phụ thuộc.
Do việc triển khai CPython (loại trăn được sử dụng phổ biến nhất), sẽ an toàn khi cho rằng Python của bạn thực sự không thể tận dụng lợi thế của đa luồng. Xem:
http://en.wikipedia.org/wiki/Global_Interpreter_Lock
https://wiki.python.org/moin/GlobalInterpreterLock
Lưu ý rằng IO miễn dịch với GIL.
Bây giờ bạn có thể làm việc về điều này. Như những người khác đã chỉ ra, bạn có thể sinh ra các quy trình con và thư viện đa xử lý có thể giúp bạn.
Tôi không thể giải quyết các vấn đề của ArcGIS, nhưng khi xử lý nhiều tác vụ bằng Python, bạn đã xem xét một trình quản lý tác vụ như Celery (celeryproject.org) chưa? Điều này sẽ yêu cầu bạn xác định các tác vụ xử lý khác nhau, gửi chúng cho "người quản lý" để phân phối, chạy "công nhân" nhận nhiệm vụ từ người quản lý, xử lý chúng và báo cáo kết quả.
Điều này là không tầm thường để thực hiện, nhưng có tính linh hoạt đáng kinh ngạc, và cho phép bạn tận dụng tối đa khả năng xử lý (nghĩa là sử dụng các lõi nhàn rỗi đó).