Computer >> Máy Tính >  >> Lập trình >> Python

Đa xử lý trong Python

Gói đa xử lý hỗ trợ các quá trình sinh sản. Nó đề cập đến một chức năng tải và thực thi một quy trình con mới. Để phần tử con kết thúc hoặc tiếp tục thực thi tính toán đồng thời, thì quy trình hiện tại phải đợi bằng cách sử dụng một API, tương tự như mô-đun phân luồng.

Giới thiệu

Khi chúng tôi làm việc với Đa xử lý, lúc đầu, chúng tôi tạo quy trình vật. Sau đó, nó gọi một phương thức start ().

Mã mẫu

 from multiprocessing import Process def display ():print ('Xin chào !! Tôi là Python') if __name__ =='__main__':p =Process (target =display) p.start () p.join () 

Trong ví dụ này, lúc đầu chúng ta nhập lớp Process sau đó khởi tạo đối tượng Process bằng hàm display ().

Sau đó, quá trình được bắt đầu bằng phương thức start () và sau đó hoàn tất quá trình bằng phương thức join ().

Chúng ta cũng có thể chuyển các đối số cho hàm bằng từ khóa args.

Ví dụ

 from multiprocessing import Process def display (my_name):print ('Hi !!!' + "" + my_name) if __name__ =='__main__':p =Process (target =display, args =('Python', )) p.start () p.join () 

Trong ví dụ này, chúng tôi tạo một quy trình tính toán khối các số và in tất cả kết quả ra bảng điều khiển.

Mã mẫu

 from multiprocessing import Process def cube (x):for x in my_numbers:print ('% s cube is% s'% (x, x ** 3)) if __name__ =='__main__':my_numbers =[3 , 4, 5, 6, 7, 8] p =Process (target =cube, args =('x',)) p.start () p.joinprint ("Xong") 

Đầu ra

 Done3 cube là 274 cube là 645 cube là 1256 cube là 2167 cube là 3438 cube là 512 

Chúng tôi cũng có thể tạo nhiều quy trình cùng một lúc.

Trong ví dụ này, lúc đầu, chúng tôi tạo một quy trình là process1, quy trình này chỉ tính toán khối lập phương của một số và đồng thời process thứ hai process2 đang kiểm tra xem số này là chẵn hay lẻ.

Ví dụ

 from multiprocessing import Processdef cube (x):for x in my_numbers:print ('% s cube is% s'% (x, x ** 3)) def Evenno (x):for x in my_numbers:if x % 2 ==0:print ('% s là số chẵn'% (x)) if __name__ =='__main__':my_numbers =[3, 4, 5, 6, 7, 8] my_process1 =Process (target =cube, args =('x',)) my_process2 =Process (target =Evenno, args =('x',)) my_process1.start () my_process2.start () my_process1.join () my_process2.join () print ( "Xong") 

Đầu ra

 3 khối là 274 khối là 645 khối là 1256 khối là 2167 khối là 3438 khối là 5124 là một số chẵn 6 là một số chẵn 8 là một số chẵn 

Giao tiếp giữa các quá trình

Đa xử lý hỗ trợ Đường ống và Hàng đợi, là hai loại kênh giao tiếp giữa các quá trình.

Đường ống

Trong xử lý đa quy trình, khi chúng ta muốn giao tiếp giữa các quy trình, trong tình huống đó Đường ống được sử dụng.

Ví dụ

 from multiprocessing import Process, Pipe def my precision (conn):conn.send (['xin chào !! Tôi là Python']) conn.close () if __name__ =='__main__':parent_conn, child_conn =Pipe () p =Process (target =my functions, args =(child_conn,)) p.start () print (parent_conn.recv ()) p.join () 

Đầu ra

 ['chào !!! Tôi là Python '] 

Pipes trả về hai đối tượng kết nối và chúng đại diện cho hai đầu của ống. Mỗi đối tượng kết nối có hai phương thức một là send () và một phương thức khác là phương thức recv ().

Trong ví dụ này, lúc đầu, chúng tôi tạo một quy trình và quy trình này in ra thông báo "xin chào !! Tôi là Python" và sau đó chia sẻ dữ liệu qua.

Hàng đợi

Khi chúng tôi chuyển dữ liệu giữa các quy trình thì lúc đó chúng tôi có thể sử dụng đối tượng Queue.

Ví dụ

 nhập đa xử lý def chẵn (số, q):cho n trong số:nếu n% 2 ==0:q.put (n) if __name__ =="__main__":q =multiprocessing.Queue () p =multiprocessing .Process (target =Evenno, args =(range (10), q)) p.start () p.join () while q:print (q.get ()) 

Đầu ra

 02468 

Trong ví dụ này, lúc đầu hãy tạo một hàm kiểm tra thời tiết một số có chẵn hay không. Nếu số chẵn thì chèn nó vào cuối hàng đợi. Sau đó, chúng tôi tạo một đối tượng hàng đợi và một đối tượng quy trình, sau đó chúng tôi bắt đầu quá trình.

Và cuối cùng kiểm tra xem hàng đợi có trống hay không.

Khi chúng tôi in các số, đầu tiên chúng tôi in giá trị ở trước hàng đợi rồi đến giá trị tiếp theo, v.v.

Khóa

Khi chúng ta muốn rằng chỉ có một quá trình được thực thi tại một thời điểm trong tình huống đó, Khóa được sử dụng. Điều đó có nghĩa là thời gian chặn quá trình khác thực thi mã tương tự. Khóa sẽ được phát hành sau khi quá trình hoàn tất.

Ví dụ sử dụng phương pháp Khóa

Ví dụ

 từ Quy trình nhập đa xử lý, Lockdef dispmay_name (l, i):l.acquire () print ('Hi', i) l.release () if __name__ =='__main__':my_lock =Lock () my_name =[ 'Aadrika', 'Adwaita', 'Sakya', 'Sanj'] cho tên trong my_name:Process (target =dispmay_name, args =(my_lock, name)). Start () 

Đầu ra

 Xin chào AadrikaHi AdwaitaHi SakyaHi Sanj 

Ghi nhật ký

Mô-đun đa xử lý cũng cung cấp mô-đun ghi nhật ký để đảm bảo rằng, nếu gói ghi nhật ký không sử dụng chức năng khóa, các thông báo giữa các quy trình sẽ bị trộn lẫn trong quá trình thực thi.

Ví dụ

 import multiprocessing, logginglogger =multiprocessing.log_to_stderr () logger.setLevel (logging.INFO) logger.warning ('Đã xảy ra lỗi') 

Trong ví dụ này, lúc đầu chúng ta nhập mô-đun ghi nhật ký và đa xử lý, sau đó chúng ta sử dụng phương thức multiprocessing.log_to_stderr (). Và nó gọi get_logger () cũng như thêm vào sys.stderr và cuối cùng chúng tôi thiết lập cấp độ của trình ghi nhật ký và truyền tải thông điệp.