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
threadingchạ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.