Sunday, January 19, 2025

[Python] Lesson 62 – Threading

-

Trong Python, threading là một kỹ thuật cho phép các hoạt động chạy đồng thời và độc lập với nhau trong một chương trình. Kỹ thuật này được sử dụng để tận dụng tối đa tài nguyên hệ thống, đồng thời tăng tốc độ thực thi của chương trình.

Mỗi thread được hiểu như một chương trình con độc lập, chạy trong một không gian địa chỉ bộ nhớ riêng và có thể thực hiện các hoạt động độc lập với các thread khác. Trong Python, chúng ta có thể sử dụng module threading để tạo và quản lý các thread.

Một số ứng dụng của threading trong Python là xử lý đa luồng trong các ứng dụng web, xử lý các tác vụ chạy song song như tải file, gửi email, đọc dữ liệu từ cơ sở dữ liệu, v.v.

Để sử dụng module threading trong Python, trước tiên ta cần import module này bằng cú pháp:

import threading

Sau đó, ta có thể tạo một đối tượng thread bằng cách khởi tạo lớp Thread trong module threading như sau:

thread = threading.Thread(target=func, args=args)

Trong đó:

  • target: là hàm mà thread sẽ thực thi.
  • args: là một tuple chứa các tham số truyền vào hàm target.

Sau khi tạo được đối tượng thread, ta có thể bắt đầu thực thi thread bằng cách gọi phương thức start() như sau:

thread.start()

Ngoài ra, ta còn có thể sử dụng các phương thức khác của đối tượng thread như join() để đợi cho thread kết thúc, is_alive() để kiểm tra xem thread đang chạy hay đã dừng, name để lấy tên của thread, ident để lấy id của thread, v.v.

Dưới đây là một ví dụ về threading trong Python:

Ví dụ 1:

import threading

def worker():
    """Hàm xử lý tác vụ trong thread"""
    print("Starting worker thread...")
    # Do some work here
    print("Finishing worker thread...")

if __name__ == "__main__":
    print("Starting main thread...")
    # Tạo một thread mới
    t = threading.Thread(target=worker)
    # Bắt đầu thực thi thread
    t.start()
    print("Finishing main thread...")

Trong ví dụ này, chúng ta sử dụng module threading để tạo một thread mới và thực thi nó. Khi chạy chương trình, trước tiên main thread sẽ được thực thi, sau đó một thread mới được tạo và bắt đầu thực thi. Cả hai thread đều hoạt động độc lập với nhau và có thể chạy song song, tùy thuộc vào tài nguyên hệ thống.

Ví dụ 2:

Đây là một ví dụ về sử dụng threading và wget để tải nhiều file cùng một lúc trên Linux:

import threading
import subprocess

def download_file(url):
    subprocess.call(['wget', url])

if __name__ == '__main__':
    urls = ['https://example.com/file1.zip', 'https://example.com/file2.zip', 'https://example.com/file3.zip']

    threads = []
    for url in urls:
        thread = threading.Thread(target=download_file, args=(url,))
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

Trong ví dụ này, chúng ta định nghĩa một hàm download_file sử dụng subprocess để gọi lệnh wget để tải về file từ địa chỉ url được truyền vào hàm.

Tiếp theo, chúng ta tạo một danh sách urls chứa các URL tải về.

Sau đó, chúng ta tạo một danh sách threads và khởi tạo mỗi luồng với target=download_fileargs=(url,) để gọi hàm download_file với đối số là url tương ứng.

Cuối cùng, chúng ta chờ cho tất cả các luồng kết thúc bằng cách sử dụng thread.join().

Khi chạy chương trình, nó sẽ tải xuống các file từ các URL cùng một lúc bằng cách sử dụng các luồng khác nhau, tăng tốc độ tải xuống.

Ví dụ 3.

Một ví dụ về sử dụng threading trong quản trị hệ thống Linux là khi bạn muốn thực hiện đồng thời nhiều tác vụ trong một chương trình Python. Ví dụ, bạn có thể sử dụng threading để thực hiện các tác vụ I/O đồng thời mà không ảnh hưởng đến hiệu suất của hệ thống.

Dưới đây là một ví dụ về sử dụng threading để tải nội dung của nhiều trang web cùng một lúc:

import threading
import requests

class WebsiteDownloader(threading.Thread):
    def __init__(self, url):
        threading.Thread.__init__(self)
        self.url = url
    
    def run(self):
        response = requests.get(self.url)
        content = response.content
        print(f"Downloaded {len(content)} bytes from {self.url}")

urls = [
    "https://www.google.com",
    "https://www.yahoo.com",
    "https://www.bing.com",
    "https://www.wikipedia.org",
    "https://www.amazon.com"
]

downloaders = []
for url in urls:
    downloader = WebsiteDownloader(url)
    downloader.start()
    downloaders.append(downloader)

for downloader in downloaders:
    downloader.join()

Trong ví dụ này, chúng ta định nghĩa một lớp con của lớp Thread để tải nội dung từ một trang web. Mỗi đối tượng WebsiteDownloader được tạo ra với một URL khác nhau. Sau đó, chúng ta khởi động mỗi đối tượng WebsiteDownloader bằng cách gọi phương thức start() của nó. Các đối tượng WebsiteDownloader này chạy đồng thời trên các thread khác nhau, cho phép chúng ta tải nội dung của nhiều trang web cùng một lúc. Cuối cùng, chúng ta đợi tất cả các thread hoàn thành bằng cách gọi phương thức join() của từng đối tượng WebsiteDownloader.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories