Python đa xử lý lưu dữ liệu
Gần đây, tôi được hỏi về việc chia sẻ các mảng lớn có nhiều mảng khi sử dụng 4 của Python. Mặc dù không được ghi lại rõ ràng, nhưng điều này thực sự có thể. Tôi sẽ viết về thủ thuật nhỏ này trong bài viết ngắn này. Hy vọng nó giúp. ) Cần lưu ý rằng tôi đang sử dụng Python 3. 6. Do đó, hướng dẫn này có thể không hoạt động trên các phiên bản Python cũ hơn Show 4 cung cấp các cách dễ dàng để thực hiện song song các tác vụ ràng buộc CPU trong Python. Tuy nhiên, không giống như đa luồng, khi truyền đối số cho các tiến trình con, các dữ liệu này trong đối số phải được chọn. Trong hầu hết các trường hợp, điều này là tốt. Đối với một số tình huống, nó không phải là. Bây giờ giả sử rằng chúng ta có một ma trận dữ liệu lớn. Chúng tôi muốn mỗi quy trình con thực hiện các tác vụ độc lập dựa trên ma trận dữ liệu này và chúng chỉ cần quyền truy cập chỉ đọc vào ma trận dữ liệu. Nếu chúng ta gửi ma trận dữ liệu cho từng tiến trình con một cách bình thường, nó sẽ bị chọn mỗi khi chúng ta lên lịch cho một tác vụ mới và rất nhiều dung lượng bộ nhớ và băng thông sẽ bị lãng phí. Để giảm thiểu vấn đề này, chúng ta có thể chia sẻ ma trận dữ liệu giữa các tiến trình conGói 6 cung cấp các đối tượng có thể chia sẻ sau. ________ 00, ________ 01, ________ 02, ________ 03. Các chi tiết có thể được tìm thấy. Về cơ bản, 0 và 1 không có khóa, trong khi 2 và 3 thì có. Bởi vì chúng tôi chỉ cần quyền truy cập chỉ đọc và chúng tôi muốn chia sẻ một ma trận, chúng tôi sẽ sử dụng 1. Đoạn mã sau sẽ tạo ra một 1 nhân đôi 0 1 này là một mảng 1D hoặc một đoạn bộ nhớ sẽ được sử dụng để chứa ma trận dữ liệu. Để thao tác dữ liệu của nó dễ dàng hơn, chúng ta có thể bọc nó dưới dạng một mảng 21 bằng cách sử dụng hàm 22. Đoạn mã sau cho biết cách một 1 được bọc dưới dạng một mảng 21 và cách sử dụng 25 để điền vào 1 với dữ liệu hiện có
Bây giờ chúng ta đã sẵn sàng chia sẻ ma trận dữ liệu với các tiến trình con. Về cơ bản, mỗi tiến trình con cần có quyền truy cập vào 20 và 21 ( 21 có thể được sao chép vào từng tiến trình mà không cần chia sẻ). Python yêu cầu đối tượng dùng chung phải được chia sẻ theo thừa kế. Do đó, chúng tôi không thể vượt qua 20 làm đối số khi sử dụng 24 hoặc 25. Thay vào đó, khi tạo nhóm, chúng tôi chỉ định một 26 và 27 của nó. 27 sẽ chứa 20 và 21 của chúng tôi. 26 sẽ được gọi khi tiến trình con được khởi tạo và chịu trách nhiệm lưu trữ 20 và 21 dưới dạng biến toàn cục. Việc triển khai đơn giản nhất của 26 này giống như sau 2Nhóm sau đó được khởi chạy thông qua 2Bây giờ chúng ta có thể viết hàm worker. Như một ví dụ về đồ chơi, hàm worker của chúng ta sẽ chỉ chấp nhận một đối số, chỉ mục hàng i và tính tổng của hàng thứ i của 20. Bởi vì cả 20 và 21 đều được lưu trữ trong 28, hàm worker đơn giản như sau 2Lưu ý rằng vì 20 là một 1, chúng ta cần bọc nó lại bằng cách sử dụng thông tin hình dạng 21 trước khi sử dụng các hàm 21Với hàm worker đã sẵn sàng, chúng ta có thể sử dụng 24 để gán nhiệm vụ tính tổng từng hàng cho các tiến trình con và thu thập kết quả. Đặt mọi thứ lại với nhau, chúng ta có 9Viết để chia sẻ mảng ⚠️Cũng có thể ghi dữ liệu vào một mảng dùng chung từ tiến trình con. Tuy nhiên, chúng ta phải cẩn thận vì ghi không đồng bộ có thể dẫn đến kết quả không mong muốn Nếu mỗi tiến trình con ghi vào các phần không chồng lấp của mảng, mọi thứ sẽ ổn. Nếu không, chúng ta sẽ cần tránh các điều kiện đua xe. Khi cần khóa, chúng ta có thể sử dụng 3 thay vì 1. Ngoài ra, khi bọc một 3 bằng một khóa dưới dạng một mảng 21, chúng ta cần sử dụng cách sau để thay thế
Python có bộ nhớ dùng chung đa xử lý không?Python cung cấp khả năng tạo và quản lý các quy trình mới thông qua tính năng đa xử lý. lớp quy trình. Trong lập trình đa xử lý, chúng ta thường cần chia sẻ dữ liệu và trạng thái chương trình giữa các quy trình. Điều này có thể đạt được bằng cách sử dụng bộ nhớ dùng chung thông qua các kiểu chữ dùng chung .
Chuỗi hàng đợi đa xử lý có an toàn không?Điều này bao gồm hàng đợi trong đa xử lý. Hàng đợi là luồng và xử lý an toàn . Điều này có nghĩa là các quy trình có thể nhận () và đặt () các mục từ và vào hàng đợi đồng thời mà không sợ điều kiện chạy đua.
Khi nào tôi nên sử dụng đa xử lý trong Python?Nhóm đa xử lý Python có thể được sử dụng để thực thi song song một chức năng trên nhiều giá trị đầu vào , phân phối dữ liệu đầu vào giữa các quy trình (song song hóa dữ liệu).
Đa xử lý có thể truy cập các biến toàn cục không?Bạn có thể chia sẻ một biến toàn cục với tất cả các quy trình worker con trong nhóm đa xử lý bằng cách xác định biến đó trong hàm khởi tạo quy trình worker . Trong hướng dẫn này, bạn sẽ khám phá cách chia sẻ biến toàn cục với tất cả worker trong nhóm quy trình Python. |