Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách triển khai Concurrency (Đa tác vụ) với Threads trong Python

Giới thiệu

Python có nhiều cách tiếp cận cho lập trình đồng thời: threads, subprocesses, generators... Trước khi triển khai, hiểu khái niệm Concurrency (Đa tác vụ):

Concurrency là logic trong một chương trình cho phép mở nhiều đường dẫn thực thi riêng biệt, bao gồm luồng I/O riêng, truy vấn SQL, v.v., khiến việc thực thi dường như đồng thời và độc lập lẫn nhau.

Cách thực hiện

1. Chương trình đơn luồng (Sequential)


import requests

tutorialpoints_url = [
    'https://www.tutorialspoint.com/python/index.htm',
    'https://www.tutorialspoint.com/cplusplus/index.htm',
    'https://www.tutorialspoint.com/java/index.htm',
    'https://www.tutorialspoint.com/html/index.htm',
    'https://www.tutorialspoint.com/cprogramming/index.htm'
]

def visit_site(site_url):
    """ Gửi GET request và in mã trạng thái + thời gian. """
    response = requests.get(site_url)
    print(f' *** {site_url} returned {response.status_code} after {response.elapsed} seconds')

if __name__ == '__main__':
    for site_url in tutorialpoints_url:
        visit_site(site_url)
    print(" *** end of the program ***")

Kết quả: Các request thực hiện tuần tự, tổng thời gian = tổng thời gian từng request.

2. Chương trình đa luồng (Threaded)


from threading import Thread
import requests

def visit_site(site_url):
    response = requests.get(site_url)
    print(f' *** {site_url} returned {response.status_code} after {response.elapsed} seconds')

if __name__ == '__main__':
    for site_url in tutorialpoints_url:
        t = Thread(target=visit_site, args=(site_url,))
        t.start()

Kết quả: Các request chạy song song, tổng thời gian ≈ thời gian request chậm nhất.

3. Kiểm tra trạng thái luồng


if t.is_alive():
    print(f' *** {t} is Still executing')
else:
    print(f' *** {t} is Completed')

Thảo luận

  • Thư viện threading chạy bất kỳ callable nào trong luồng riêng.
  • start() gọi hàm mục tiêu với đối số đã cho.
  • Luồng sau khi start được quản lý hoàn toàn bởi hệ điều hành.
  • Phù hợp cho tác vụ I/O-bound (mạng, đĩa, database).
  • Lưu ý: GIL (Global Interpreter Lock) giới hạn đa luồng CPU-bound trong CPython.