Main stream is running the other program in the same time point. Một ví dụ điển hình về đa luồng chẳng hạn như trong một máy tính, có thể đồng thời ta có thể sử dụng phần mềm A, phần mềm B…. in the same time or open them song song với nhau. Trong Python, việc chạy các chương trình cùng một thời điểm [đa luồng] sẽ mang lại nhiều lợi ích khác nhau như
- Cùng chia sẻ một không gian dữ liệu với luồng chính và do đó có thể chia sẻ thông tin hoặc giao tiếp với nhau dễ dàng hơn so với việc các chương trình là các quy trình riêng biệt
- Các chương trình chạy nhẹ hơn và không yêu cầu nhiều bộ nhớ cấp phát
Trong Python, cung cấp sẵn thư viện cho chúng tôi để xử lý đa luồng. Thư viện đó chính là _thread và để sử dụng nó ta chỉ cần nhập thư viện có sẵn này vào chương trình như sau
import _thread
Sau khi thư viện được nhập vào chương trình, bạn hoàn toàn có thể sử dụng các phương thức có sẵn trong _thread để thực hiện xử lý các tác vụ đa luồng trong Python
2. Tạo luồng mới [Chủ đề mới] trong PythonCác chương trình Python trước đây mà ta từng biết, chúng đều thực hiện chạy độc lập với nhau [vì chưa sử dụng đa luồng]. Trong một số trường hợp hoặc một số yêu cầu bắt buộc, chúng ta cần phải chạy các chương trình một cách song song với nhau [hoặc chạy đa luồng] trong Python bằng cách tạo ra các luồng mới
Như đã đề cập ở trên, thư viện _thread trong Python sẽ hỗ trợ các tác vụ đa luồng này. Trong đó, bắt đầu tạo ra một luồng mới [luồng mới] mà chúng ta cần phải sử dụng hàm _thread. start_new_thread[] to make this thing – Hàm này được sử dụng một cách nhanh chóng và hiệu quả để tạo ra các luồng mới trong cả hệ điều hành Linux hoặc Windows. Cú pháp đầy đủ của hàm như sau
_thread.start_new_thread [ function, args[, kwargs] ]
in which
- function is name function are running in new stream
- args[, kwargs] là các tham số được truyền vào hàm
Một ví dụ dưới đây, sử dụng hàm _thread. start_new_thread[] để thực hiện chạy đa luồng đối với hàm có tên là print_time[tenLuong, delay] và các tham số truyền vào hàm là tenLuong, delay.
import _thread import time # Dinh nghia mot ham duoc chay trong luong moi def print_time[tenLuong, delay]: count = 0 while count < 5: time.sleep[delay] count += 1 print ["{0}: {1}".format[tenLuong, time.ctime[time.time[]]]] # Tao hai luong song song va thuc thi chung try: _thread.start_new_thread[print_time, ["Luong 1", 2,]] _thread.start_new_thread[print_time, ["Luong 2", 4,]] except: print ["Loi: Khong the bat dau luong moi"] while 1: pass
Kết quả
Lương 2. Thứ hai 23 tháng 5 18. 39. 35 2022
Lương 1. Thứ hai 23 tháng 5 18. 39. 35 2022
Lương 1. Thứ hai 23 tháng 5 18. 39. 37 2022
Lương 2. Thứ hai 23 tháng 5 18. 39. 39 2022
Lương 1. Thứ hai 23 tháng 5 18. 39. 39 2022
Lương 1. Thứ hai 23 tháng 5 18. 39. 41 2022
Lương 2. Thứ hai 23 tháng 5 18. 39. 43 2022
Lương 2. Thứ hai 23 tháng 5 18. 39. 47 2022
Lương 2. Thứ hai 23 tháng 5 18. 39. 51 2022
Có thể thấy rằng ở ví dụ trên, ta chạy hàm print_time[] bằng cách chạy đồng thời và song song với nhau. Thời gian của luồng 1 trong hàm print_time[] được chạy cách nhau 2 giây và thời gian của luồng 2 trong hàm print_time[] được chạy cách nhau 4 giây
3. Mô-đun phân luồng trong Python3. 1 Tổng số mô-đun Threading trong Python
Mô-đun Threading được coi là thư viện xử lý phân luồng cao cấp hơn so với _thread mà ở phần trước ta đã sử dụng để xử lý đa luồng. Để sử dụng mô-đun được mô-đun Threading ta cần nhập chúng vào trong chương trình Python thì cần sử dụng như sau
import threading
Như đã đề cập, mô-đun này là mô-đun cao cấp hơn so với _thread vì vậy chúng tôi cũng cung cấp thêm nhiều lớp và phương thức để xử lý nhiều luồng hơn và được liệt kê trong bảng xử lý dưới đây
Phương thức chức năng phân luồng. activeCount[]Trả về số đối tượng luồng đang hoạt động. xâu chuỗi. currentThread[]Trả về luồng đối tượng số trong điều khiển luồng của người gọi. luồng. enumerate[]Trả về danh sách tất cả các luồng đối tượng đang hoạt độngNgoài các phương thức trên, trong mô-đun Threading còn có một lớp Thread để phát triển đa luồng. Trong lớp Chủ đề này cũng có các phương thức sau
3. 2 Tạo luồng mới bằng mô-đun Phân luồng trong Python
Để tạo một luồng mới bằng cách sử dụng mô-đun Threading, chúng ta cần thực hiện 3 bước chính được miêu tả như sau
- Bước 1. Định nghĩa một lớp con mới kế thừa lại lớp Chủ đề
- Bước 2. Ghi đè phương thức khởi tạo __init __ [self [, args]] để bổ sung các đối số bổ sung
- Bước 3. Ghi đè phương thức run [self [, args]] để phát triển khai thác những gì mà luồng sẽ làm khi bắt đầu
Các lớp con được kế thừa lại từ lớp Chủ đề đều có khả năng phản ánh lại thành một cách riêng và để thực hiện phân luồng cho lớp đó, chúng ta sẽ gọi thông qua phương thức start[] và sau đó gọi đến phương thức run[]
import threading import time exitFlag = 0 class myThread[threading.Thread]: def __init__[self, idLuong, tenLuong, soLuong]: threading.Thread.__init__[self] self.threadID = idLuong self.name = tenLuong self.counter = soLuong def run[self]: print["Bat dau luong: " + self.name] print_time[self.name, 5, self.counter] print ["Ket thuc luong: " + self.name] def print_time[tenLuong, soLuong, delay]: while soLuong: if exitFlag: tenLuong.exit[] time.sleep[delay] print ["{0}: {1}".format[tenLuong, time.ctime[time.time[]]]] soLuong -= 1 # Tao luong moi luong1 = myThread[1, "Luong-1", 1] luong2 = myThread[2, "Luong-2", 2] # Bat dau luong moi luong1.start[] luong2.start[] print["Thoat khoi luong chinh!"]
Kết quả
Bát đầu lượng. Luong-1Bát đầu lương. Luong-2
Thoat khoi luong chinh.
Luong-1. T3 24 tháng 5 12. 38. 12 2022
Luong-2. T3 24 tháng 5 12. 38. 13 2022
Luong-1. T3 24 tháng 5 12. 38. 13 2022
Luong-1. T3 24 tháng 5 12. 38. 14 2022
Luong-2. T3 24 tháng 5 12. 38. 15 2022
Luong-1. T3 24 tháng 5 12. 38. 15 2022
Luong-1. T3 24 tháng 5 12. 38. 16 2022
Kết thúc lượng. Lương-1
Lương-2. T3 24 tháng 5 12. 38. 17 2022
Luong-2. T3 24 tháng 5 12. 38. 19 2022
Luong-2. T3 24 tháng 5 12. 38. 21 2022
Ket thuc luong. Lương-2
3. 3 Đồng bộ hóa các luồng trong Python
Mô-đun Threading được cung cấp với Python bao gồm cơ chế khóa đơn giản để khai thác cho phép bạn đồng bộ hóa các luồng. Một khóa mới được tạo bằng cách gọi phương thức lock[]. Phương thức thu được [chặn] của khóa đối tượng mới được sử dụng để buộc các luồng chạy đồng bộ. Tham số chặn của phương thức này là tùy chọn, chúng tôi cho phép bạn kiểm tra xem luồng có chờ lấy khóa hay không
- Nếu tham số chặn = 0 thì luồng sẽ trả về 2 giá trị đó là. 0 hoặc 1. Nếu phương thức trả về 0 có nghĩa là không thể truy xuất khóa và với giá trị 1 nếu đã có khóa
- Nếu tham số chặn = 1 thì luồng sẽ bị chặn lại và chờ đợi giải nén
Cuối cùng, phương thức phát hành[] của đối tượng từ khóa mới được sử dụng để giải nén từ khóa khi nó không còn được yêu cầu