Mô-đun _thread trong thư viện Python cung cấp giao diện cấp thấp để làm việc với các tiến trình nhẹ có nhiều luồng chia sẻ không gian dữ liệu toàn cục. Để đồng bộ hóa, các khóa đơn giản (còn gọi là mutex hoặc semaphore nhị phân) được định nghĩa trong mô-đun này. Mô-đun tích hợp sẵn threading cung cấp API luồng cấp cao hơn được xây dựng dựa trên mô-đun này.
start_new_thread()
Hàm cấp mô-đun này được dùng để mở một luồng mới trong tiến trình hiện tại. Hàm nhận một đối tượng hàm làm đối số. Hàm này được gọi khi luồng mới được tạo thành công. Phạm vi của hàm này tương ứng với vòng đời của luồng. Luồng có thể bị chặn bằng cách gọi hàm sleep().
Đoạn mã sau là ví dụ đơn giản về cơ chế luồng sử dụng mô-đun _thread.
import _thread
import time
def run(threadName):
count = 0
for i in range(1, 6):
time.sleep(5)
print(threadName, i)
_thread.start_new_thread(run, ("child",))
for i in range(1, 6):
print('main', i)
time.sleep(5)Hàm start_new_thread() tạo ra một luồng mới gọi hàm run song song. Có một vòng lặp trong hàm run() cũng như trong luồng chính của chương trình. Gọi hàm sleep() trong cả hai dẫn đến thực thi chồng chéo như sau:
main 1 child 1 main 2 child 2 main 3 child 3 main 4 child 4 main 5 child 5
Đồng bộ hóa giữa các luồng được đạt được bằng cách sử dụng đối tượng Lock. Hàm allocate_lock() trả về đối tượng khóa. Các phương thức sau có sẵn cho nó:
acquire()
Phương thức này lấy khóa vô điều kiện cho đến khi nó được giải phóng bởi luồng khác. Chỉ một luồng tại một thời điểm có thể lấy khóa. Giá trị trả về là True nếu khóa được lấy thành công, False nếu không.
release()
Phương thức này giải phóng khóa. Khóa phải đã được lấy trước đó, nhưng không nhất thiết phải bởi cùng một luồng.
Trong ví dụ sau, hai luồng được khai báo. Mỗi luồng gọi hàm run() đồng thời. Một trong số chúng lấy khóa và tiến vào hàm synchronized trong khi luồng kia chờ đợi.
import _thread
import time
def run(threadName):
lock.acquire()
synchronized(threadName)
lock.release()
def synchronized(threadName):
print(threadName, "has acquired lock")
counter = 10
while counter:
time.sleep(1)
print('*', end='')
counter = counter - 1
print('\n{} has released lock'.format(threadName))
lock = _thread.allocate_lock()
_thread.start_new_thread(run, ("t1",))
_thread.start_new_thread(run, ("t2",))Đầu ra
>>> t1 has acquired lock ********** t1 has released lock t2 has acquired lock ********** t2 has released lock