Multiprocessing là một module trong Python cung cấp tính năng tạo và quản lý các tiến trình con. Nó cho phép thực hiện các tác vụ đồng thời và tận dụng tối đa tài nguyên hệ thống. Module multiprocessing được thiết kế để tương thích với module threading, cung cấp một API tương tự để sử dụng với các tiến trình.
Cú pháp khai báo:
from multiprocessing import Process
Sau khi import module Process, ta có thể tạo một tiến trình con bằng cách tạo một instance của lớp Process và truyền vào đối số là một hàm thực hiện tác vụ của tiến trình đó.
Ví dụ 1:
from multiprocessing import Process
import time
def print_numbers():
for i in range(1, 11):
print(i)
time.sleep(1)
if __name__ == '__main__':
p = Process(target=print_numbers)
p.start()
p.join()
Trong ví dụ này, chúng ta tạo một tiến trình con bằng cách tạo một instance của lớp Process, và truyền vào hàm print_numbers để thực hiện. Sau khi tiến trình con được khởi tạo, ta gọi phương thức start() để bắt đầu thực thi, và phương
Đoạn code trên sử dụng module multiprocessing để tạo ra một tiến trình mới. Đầu tiên, ta import module Process và module time để sử dụng các hàm cần thiết.
Sau đó, chúng ta định nghĩa một hàm print_numbers() để in ra các số từ 1 đến 10, với mỗi số được in ra cách nhau 1 giây bằng cách sử dụng hàm sleep() trong module time.
Trong block if __name__ == '__main__':
, ta tạo một instance của lớp Process với tham số đầu vào là hàm print_numbers(). Sau đó, ta bắt đầu tiến trình bằng phương thức start() và sử dụng phương thức join() để đợi cho tiến trình kết thúc.
Khi đoạn code được chạy, một tiến trình mới sẽ được tạo ra để thực thi hàm print_numbers(). Do tiến trình này được tạo ra bằng cách sử dụng module multiprocessing, nó hoàn toàn độc lập với tiến trình chính. Nhờ đó, việc thực thi hàm print_numbers() có thể xảy ra song song với các tác vụ khác trong tiến trình chính, giúp tăng hiệu suất thực thi chương trình.
Ví dụ 2:
Dưới đây là ví dụ về multiprocessing trong Python:
import multiprocessing
def square(number):
result = number * number
process_name = multiprocessing.current_process().name
print(f"{process_name}: {number} squared to {result}")
if __name__ == "__main__":
numbers = [1, 2, 3, 4, 5, 6]
processes = []
for number in numbers:
process = multiprocessing.Process(target=square, args=(number,))
processes.append(process)
process.start()
for process in processes:
process.join()
Trong ví dụ này, chúng ta tạo một list numbers
gồm 6 số nguyên. Tiếp theo, chúng ta tạo một list trống processes
và duyệt qua từng số trong numbers
. Với mỗi số, chúng ta tạo một tiến trình mới bằng cách sử dụng module multiprocessing
của Python, sử dụng hàm Process()
và truyền đối số target
là hàm square
cùng với đối số args
là số đó.
Hàm square
nhận vào một số number
, tính bình phương của số đó và in ra kết quả cùng với tên của tiến trình hiện tại thông qua multiprocessing.current_process().name
.
Sau khi tạo các tiến trình, chúng ta bắt đầu chạy chúng bằng cách sử dụng phương thức start()
của từng tiến trình. Sau đó, chúng ta đợi tất cả các tiến trình hoàn thành bằng cách sử dụng phương thức join()
của từng tiến trình trong danh sách processes
.
Khi chạy chương trình, chúng ta có thể thấy rằng tất cả các số đều được tính bình phương bởi các tiến trình khác nhau cùng một lúc.
Ví dụ 3:
Giả sử bạn có một tập tin chứa các đường dẫn đến các hình ảnh trên hệ thống của mình và bạn muốn chạy đồng thời nhiều tiến trình để tải xuống các hình ảnh đó. Bạn có thể sử dụng Multiprocessing để giải quyết vấn đề này một cách dễ dàng.
Dưới đây là ví dụ về cách sử dụng Multiprocessing để tải xuống các hình ảnh từ tập tin đường dẫn:
from multiprocessing import Pool
import urllib.request
def download_image(url):
filename = url.split("/")[-1]
urllib.request.urlretrieve(url, filename)
print(f"Downloaded {filename}")
if __name__ == '__main__':
with open("image_urls.txt") as f:
urls = f.read().splitlines()
pool = Pool(processes=4) # Sử dụng 4 tiến trình để tải xuống các hình ảnh
pool.map(download_image, urls) # Sử dụng map function để chạy các tiến trình và truyền danh sách các đường dẫn hình ảnh vào hàm download_image
Trong ví dụ này, chúng ta sử dụng multiprocessing.Pool
để tạo một nhóm các tiến trình. processes=4
được sử dụng để chỉ định số lượng tiến trình được sử dụng để tải xuống các hình ảnh. Sau đó, chúng ta đọc các đường dẫn hình ảnh từ tập tin image_urls.txt
, sử dụng map()
để chạy hàm download_image
cho mỗi đường dẫn hình ảnh. Cuối cùng, chúng ta đóng pool và đợi cho tất cả các tiến trình hoàn thành.