× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Đa xử lý trong Python - Hé lộ cách tốt nhất để thực hiện đa xử lý

25/05/2021 01:49

(Đa xử lý trong Python) Năm 2021 là một năm rất quan trọng đối với sự phát triển công nghệ trên toàn cầu. Bắt đầu từ việc các nhà sản xuất máy tính tập trung bổ sung nhiều lõi hơn vào CPU và bộ vi xử lý của họ cho đến việc tung ra những con chip thông minh hơn trong điện thoại di động, đa xử lý hay multiprocessing không còn là một giấc mơ xa vời. 

 

Ngày nay, một trong những ngôn ngữ lập trình nổi bật nhất hỗ trợ Đa xử lý là Python. Nhờ việc giới thiệu sức mạnh xử lý song song trong các vấn đề, các lập trình viên trên khắp thế giới giờ đây có thể tạo liền mạch các mã để thực thi đồng thời và do đó thời gian chạy của chúng tăng lên đáng kể. Trong bài viết này, chúng ta sẽ tìm hiểu về đa xử lý trong Python - multiprocessing trong Python cùng các ví dụ cụ thể.

Khái niệm đa xử lý trong Python

Khái niệm đa xử lý trong Python

Multiprocessing - Đa xử lý trong Python là gì?

Multiprocessing đang dần trở thành xu thế với những tiện ích hỗ trợ lập trình viên trong quá trình  làm việc. Vậy đa xử lý trong Python là gì mà lại được các lập trình viên yêu thích đến thế.

Khái niệm đa xử lý trong Python

Đa xử lý có thể được định nghĩa một cách đơn giản là khả năng của một hệ thống hỗ trợ nhiều hơn một hoạt động tại bất kỳ trường hợp cụ thể nào. Điều này có nghĩa là các ứng dụng trong hệ thống đa xử lý được chia thành các phần nhỏ và sau đó chạy độc lập với nhau để tăng hiệu quả và giảm thời gian chạy tổng thể. Bộ xử lý trong hệ thống phân bổ mỗi phần nhỏ một luồng độc lập của riêng nó, do đó cho phép nó hoạt động như một thực thể độc lập. 

Tại sao lại cần sử dụng đa xử lý trong Python

Hãy tưởng tượng một hệ thống máy tính chỉ có một lõi trong bộ xử lý của nó. Nếu nhiều nhiệm vụ được giao cho lõi đơn này, thì nó sẽ ngắt từng tác vụ ở giữa và sau đó chuyển sang nhiệm vụ tiếp theo. Điều này sẽ không làm tăng lượng thời gian cần thiết để hoàn thành mỗi nhiệm vụ, mà còn làm giảm hiệu quả chung của hệ thống. 

Mặt khác, một máy tính có khả năng đa xử lý, có thể có một bộ xử lý mà lần lượt có nhiều đơn vị hoạt động bên trong nó, được gọi là các lõi riêng lẻ có khả năng chạy một số tác vụ khác nhau cùng một lúc một cách độc lập. Điều này không chỉ làm tăng hiệu quả của hệ thống mà về lâu dài còn làm giảm đáng kể thời gian chạy của hệ thống. 

>>> Đọc thêm:  Self trong Python - Bật mí lý do cần sử dụng self trong Python

Các loại đa xử lý trong Python

Các loại đa xử lý trong Python

Các loại đa xử lý trong Python

Hệ thống đa xử lý trong Python có thể có hai loại như sau:

Hệ thống đa bộ xử lý

Hệ thống này về cơ bản có nhiều bộ xử lý hiện diện dưới lớp vỏ của nó, mỗi bộ xử lý có thể thực hiện một tác vụ tại một thời điểm và hoạt động như một thành phần độc lập. 

Hệ thống bộ xử lý đa lõi

Hệ thống này có nhiều lõi hiện diện trong cùng một bộ xử lý, trong đó lõi hoạt động như một đơn vị riêng biệt và thực hiện các tác vụ được giao cho nó một cách độc lập. 

Mã đa xử lý trong Python

Bây giờ bạn đã quen với khái niệm cơ bản về đa xử lý, hãy cùng i khám phá cách đa xử lý có thể đạt được trong Python. Trong Python, trình thông dịch chứa một API rất đơn giản và trực quan, thực hiện một tác vụ duy nhất, chia nó thành nhiều thành phần và xử lý chúng một cách độc lập. Hãy xem mô-đun chương trình bên dưới để hiểu rõ hơn về khái niệm Đa xử lý trong Python.

Ví dụ:

# importing the multiprocessing module

import multiprocessing

def print_cube(num):

"""

function to print cube of given num

"""

print("Cube: {}".format(num * num * num))

def print_square(num):

"""

function to print square of given num

"""

print("Square: {}".format(num * num))

if __name__ == "__main__":

# creating processes

p1 = multiprocessing.Process(target=print_square, args=(10, ))

p2 = multiprocessing.Process(target=print_cube, args=(10, ))

# starting process 1

p1.start()

# starting process 2

p2.start()

# wait until process 1 is finished

p1.join()

# wait until process 2 is finished

p2.join()

# both processes finished

print("Done!") 

Output

Square: 100

Cube: 1000

Phân tích ví dụ để hiểu rõ hơn về đa xử lý trong Python

Bây giờ chúng ta hãy phân tích chương trình này để hiểu rõ hơn.

  1. Bước đầu tiên là nhập mô-đun đa xử lý. Để thực hiện việc này, hãy sử dụng cú pháp sau: nhập đa xử lý.
  2. Bây giờ mô-đun đa xử lý đã được nhập, chúng ta hãy tiếp tục và tạo một quy trình. Để làm điều này, chúng ta tạo một đối tượng của lớp Process và gán cho nó các đối số sau. Target: hàm cần được thực thi bởi quá trình này và args: các đối số cần được truyền cho hàm đích. 

Lưu ý: Một phương thức khởi tạo quy trình có khả năng nhận nhiều mục tiêu cũng như các đối số; nhưng trong ví dụ trên, chúng ta đã chỉ định Quy trình của mình chỉ có hai mục tiêu và đối số như được hiển thị bên dưới. 

p1 = multiprocessing.Process (target = print_square, args = (10,))

p2 = multiprocessing.Process (target = print_cube, args = (10,))
  1. Bây giờ quá trình đã được tạo, chúng ta hãy viết cú pháp để bắt đầu giống nhau. 
p1.start ()

p2.start ()

Khi quá trình được bắt đầu, chương trình hiện tại và chương trình đã thực thi sẽ được chạy đồng thời. Nếu trong một tình huống nào đó, bạn cần dừng việc thực thi chương trình hiện tại và chỉ tập trung vào việc thực thi chương trình đã có từ trước, chúng ta sử dụng hàm nối như hình dưới đây. 

p1.join ()

p2.join ()

Khi bạn nhập cú pháp này, trình thông dịch sẽ đợi chương trình p1 kết thúc quá trình thực thi và sau đó chuyển sang chương trình p2.

Để hiểu thêm về khái niệm này, hãy xem một ví dụ khác về Đa xử lý trong Python bên dưới. 

Ví dụ:

# importing the multiprocessing module

import multiprocessing

import os

def worker1():

# printing process id

print("ID of process running worker1: {}".format(os.getpid()))

def worker2():

# printing process id

print("ID of process running worker2: {}".format(os.getpid()))

if __name__ == "__main__":

# printing main program process id

print("ID of main process: {}".format(os.getpid()))

# creating processes

p1 = multiprocessing.Process(target=worker1)

p2 = multiprocessing.Process(target=worker2)

# starting processes

p1.start()

p2.start()

# process IDs

print("ID of process p1: {}".format(p1.pid))

print("ID of process p2: {}".format(p2.pid))

# wait until processes are finished

p1.join()

p2.join()

# both processes finished

print("Both processes finished execution!")

# check if processes are alive

print("Process p1 is alive: {}".format(p1.is_alive()))

print("Process p2 is alive: {}".format(p2.is_alive())) 

Out put:

ID of main process: 18938

ID of process running worker1: 18939

ID of process running worker2: 18940

ID of process p1: 18939

ID of process p2: 18940

Both processes finished execution!

Process p1 is alive: False

Process p2 is alive: False

Kết luận:

Đa xử lý trong Python là tính năng hỗ trợ mà bất kỳ lập trình viên nào cũng cần sử dụng. Bài viết trên đã giới thiệu tới bạn các tốt nhất để thực hiện đa xử lý trong Python. Bạn có thể tìm hiểu thêm về Python và các ngôn ngữ lập trình khác qua các khóa học lập trình tại tại Viện công nghệ thông tin T3H bạn nhé! .

Nguồn: edureka