Vòng lặp đa xử lý Python

Vong Lap Da Xu Ly Python



Đa xử lý có thể so sánh với đa luồng. Tuy nhiên, nó khác ở chỗ chúng ta chỉ có thể thực thi một luồng tại một thời điểm do GIL được sử dụng cho luồng. Đa xử lý là quá trình thực hiện các hoạt động tuần tự trên một số lõi CPU. Các luồng không thể hoạt động song song. Tuy nhiên, tính năng đa xử lý cho phép chúng tôi thiết lập các quy trình và chạy chúng đồng thời trên nhiều lõi CPU khác nhau. Vòng lặp, chẳng hạn như vòng lặp for, là một trong những ngôn ngữ kịch bản được sử dụng thường xuyên nhất. Lặp lại cùng một công việc bằng cách sử dụng nhiều dữ liệu khác nhau cho đến khi đạt được một tiêu chí, chẳng hạn như số lần lặp được xác định trước. Vòng lặp hoàn thành từng lần lặp một.

Ví dụ 1:  Sử dụng Vòng lặp For trong Mô-đun đa xử lý của Python

Trong ví dụ này, chúng tôi sử dụng vòng lặp for và quy trình lớp mô-đun đa xử lý Python. Chúng tôi bắt đầu với một ví dụ rất đơn giản để bạn có thể nhanh chóng hiểu cách thức hoạt động của vòng lặp for đa xử lý trong Python. Sử dụng một giao diện có thể so sánh được với mô-đun phân luồng, gói đa xử lý tạo ra các quy trình.







Bằng cách sử dụng các quy trình phụ thay vì các luồng, gói đa xử lý cung cấp cả đồng thời cục bộ và từ xa, do đó tránh được Khóa thông dịch viên toàn cầu. Sử dụng vòng lặp for, có thể là đối tượng chuỗi hoặc bộ, để lặp lại liên tục qua một chuỗi. Điều này hoạt động ít giống như từ khóa được thấy trong các ngôn ngữ lập trình khác và giống như một phương thức lặp được tìm thấy trong các ngôn ngữ lập trình khác. Bằng cách bắt đầu một đa xử lý mới, bạn có thể chạy vòng lặp for thực thi đồng thời một thủ tục.



Hãy bắt đầu bằng cách triển khai mã để thực thi mã bằng cách sử dụng công cụ 'gián điệp'. Chúng tôi tin rằng “spyder” cũng là thứ tốt nhất để chạy Python. Chúng tôi nhập quy trình mô-đun đa xử lý mà mã đang chạy. Khái niệm đa xử lý trong Python được gọi là “lớp quy trình” tạo ra một quy trình Python mới, cung cấp cho nó một phương thức để thực thi mã và cung cấp cho ứng dụng gốc một cách để quản lý việc thực thi. Lớp Process chứa các thủ tục start() và join(), cả hai đều rất quan trọng.



Tiếp theo, chúng tôi xác định một chức năng do người dùng xác định có tên là “func”. Vì nó là một chức năng do người dùng định nghĩa, chúng tôi đặt tên cho nó theo lựa chọn của chúng tôi. Bên trong phần thân của hàm này, chúng ta chuyển biến “subject” làm đối số và giá trị “maths”. Tiếp theo, chúng ta gọi hàm “print()”, chuyển câu lệnh “Tên của chủ đề chung là” cũng như đối số “chủ đề” chứa giá trị của nó. Sau đó, trong bước tiếp theo, chúng tôi sử dụng “if name== _main_”, ngăn bạn chạy mã khi tệp được nhập dưới dạng mô-đun và chỉ cho phép bạn làm như vậy khi nội dung được thực thi dưới dạng tập lệnh.





Trong hầu hết các trường hợp, phần điều kiện mà bạn bắt đầu có thể được coi là vị trí cung cấp nội dung chỉ được thực thi khi tệp của bạn chạy dưới dạng tập lệnh. Sau đó, chúng tôi sử dụng chủ đề đối số và lưu trữ một số giá trị trong đó là “khoa học”, “tiếng Anh” và “máy tính”. Sau đó, quy trình này được đặt tên là “quy trình1[]” trong bước tiếp theo. Sau đó, chúng tôi sử dụng “quy trình(đích=func)” để gọi hàm trong quy trình. Mục tiêu được sử dụng để gọi hàm và chúng tôi lưu quá trình này trong biến “P”.

Tiếp theo, chúng ta sử dụng “process1” để gọi hàm “append()” để thêm một mục vào cuối danh sách mà chúng ta có trong hàm “func”. Vì quy trình được lưu trữ trong biến “P”, nên chúng tôi chuyển “P” cho hàm này làm đối số của nó. Cuối cùng, chúng tôi sử dụng chức năng “start()” với “P” để bắt đầu quá trình. Sau đó, chúng tôi chạy lại phương thức trong khi cung cấp đối số 'chủ đề' và sử dụng 'for' trong chủ đề. Sau đó, sử dụng “process1” và phương thức “add()” một lần nữa, chúng tôi bắt đầu quá trình. Quá trình sau đó sẽ chạy và đầu ra được trả về. Sau đó, thủ tục được yêu cầu kết thúc bằng cách sử dụng kỹ thuật “join()”. Các quy trình không gọi thủ tục “join()” sẽ không thoát. Một điểm quan trọng là tham số từ khóa “args” phải được sử dụng nếu bạn muốn cung cấp bất kỳ đối số nào thông qua quy trình.




Bây giờ, bạn có thể thấy trong kết quả đầu ra rằng câu lệnh được hiển thị trước tiên bằng cách chuyển giá trị cho chủ đề “toán học” mà chúng tôi chuyển vào hàm “func” vì trước tiên chúng tôi gọi nó bằng cách sử dụng hàm “process”. Sau đó, chúng tôi sử dụng lệnh “append()” để có các giá trị đã có trong danh sách được thêm vào cuối. Sau đó, “khoa học”, “máy tính” và “tiếng Anh” đã được trình bày. Tuy nhiên, như bạn có thể thấy, các giá trị không theo đúng trình tự. Điều này là do họ làm như vậy ngay khi thủ tục kết thúc và báo cáo tin nhắn của họ.

Ví dụ 2: Chuyển đổi vòng lặp tuần tự thành vòng lặp song song đa xử lý

Trong ví dụ này, tác vụ vòng lặp đa xử lý được thực hiện tuần tự trước khi được chuyển thành tác vụ vòng lặp for song song. Bạn có thể duyệt qua các chuỗi như tập hợp hoặc chuỗi theo thứ tự xuất hiện của chúng bằng cách sử dụng vòng lặp for.

Bây giờ, hãy bắt đầu triển khai mã. Đầu tiên, chúng tôi nhập 'ngủ' từ mô-đun thời gian. Sử dụng thủ tục “sleep()” trong mô-đun thời gian, bạn có thể tạm dừng việc thực thi chuỗi cuộc gọi bao lâu tùy thích. Sau đó, chúng tôi sử dụng “ngẫu nhiên” từ mô-đun ngẫu nhiên, xác định một hàm có tên “func” và chuyển từ khóa “argu”. Sau đó, chúng tôi tạo một giá trị ngẫu nhiên bằng cách sử dụng “val” và đặt nó thành “ngẫu nhiên”. Sau đó, chúng tôi chặn trong một khoảng thời gian ngắn bằng cách sử dụng phương thức “sleep()” và chuyển “val” làm tham số. Sau đó, để truyền một thông báo, chúng tôi chạy phương thức “print()”, chuyển các từ “ready” và từ khóa “arg” làm tham số của nó, cũng như “created” và chuyển giá trị bằng cách sử dụng “val”.

Cuối cùng, chúng tôi sử dụng “flush” và đặt nó thành “True”. Người dùng có thể quyết định có đệm đầu ra hay không bằng cách sử dụng tùy chọn flush trong chức năng in của Python. Giá trị mặc định của tham số này là Sai cho biết rằng đầu ra sẽ không được lưu vào bộ đệm. Đầu ra được hiển thị dưới dạng một loạt các dòng nối tiếp nhau nếu bạn đặt nó thành true. Sau đó, chúng tôi sử dụng “if name== main” để bảo vệ các điểm vào. Tiếp theo, chúng tôi thực hiện công việc tuần tự. Ở đây, chúng tôi đặt phạm vi thành “10”, nghĩa là vòng lặp kết thúc sau 10 lần lặp. Tiếp theo, chúng ta gọi hàm “print()”, truyền cho nó câu lệnh đầu vào “ready” và sử dụng tùy chọn “flush=True”.


Bây giờ bạn có thể thấy rằng khi chúng ta thực thi mã, vòng lặp sẽ khiến hàm chạy “10” lần. Nó lặp đi lặp lại 10 lần, bắt đầu từ chỉ số 0 và kết thúc ở chỉ số 9. Mỗi thông báo chứa một số nhiệm vụ là một số chức năng mà chúng tôi chuyển vào dưới dạng “arg” và một số tạo.


Vòng lặp tuần tự này hiện đang được chuyển đổi thành vòng lặp for song song đa xử lý. Chúng tôi sử dụng cùng một mã, nhưng chúng tôi sẽ chuyển sang một số thư viện và chức năng bổ sung cho đa xử lý. Do đó, chúng tôi phải nhập quy trình từ đa xử lý, giống như chúng tôi đã giải thích trước đó. Tiếp theo, chúng ta tạo một hàm gọi là “func” và chuyển từ khóa “arg” trước khi sử dụng “val=random” để lấy một số ngẫu nhiên.

Sau đó, sau khi gọi phương thức “print()” để hiển thị thông báo và đưa ra tham số “val” để trì hoãn một khoảng thời gian ngắn, chúng tôi sử dụng hàm “if name= main” để bảo mật các điểm vào. Sau đó, chúng tôi tạo một quy trình và gọi hàm trong quy trình bằng cách sử dụng “quy trình” và chuyển “đích=func”. Sau đó, chúng ta chuyển “func”, “arg”, chuyển giá trị “m” và chuyển phạm vi “10”, có nghĩa là vòng lặp kết thúc chức năng sau “10” lần lặp. Sau đó, chúng ta bắt đầu quá trình bằng cách sử dụng phương thức “start()” với “process”. Sau đó, chúng ta gọi phương thức “join()” để chờ quá trình thực hiện và hoàn thành tất cả quá trình sau đó.


Do đó, khi chúng tôi thực thi mã, các hàm sẽ gọi quy trình chính và bắt đầu thực thi chúng. Tuy nhiên, chúng được thực hiện cho đến khi tất cả các nhiệm vụ được hoàn thành. Chúng ta có thể thấy rằng bởi vì mỗi nhiệm vụ được thực hiện đồng thời. Nó báo cáo tin nhắn của nó ngay sau khi nó kết thúc. Điều này có nghĩa là mặc dù các thông báo không theo thứ tự, nhưng vòng lặp sẽ kết thúc sau khi hoàn thành tất cả '10' lần lặp.

Sự kết luận

Chúng tôi đã đề cập đến vòng lặp for đa xử lý của Python trong bài viết này. Chúng tôi cũng trình bày hai hình minh họa. Hình minh họa đầu tiên cho thấy cách sử dụng vòng lặp for trong thư viện xử lý đa vòng lặp của Python. Và hình minh họa thứ hai cho thấy cách thay đổi vòng lặp for tuần tự thành vòng lặp for đa xử lý song song. Trước khi xây dựng tập lệnh cho đa xử lý Python, chúng ta phải nhập mô-đun đa xử lý.