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

Đồng bộ hóa luồng trong Python


Mô-đun threading đi kèm với Python bao gồm một cơ chế khóa đơn giả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(), trả về khóa mới.

Phương thức acquire(blocking) của đối tượng khóa mới được dùng để buộc các luồng chạy đồng bộ. Tham số tùy chọn blocking cho phép bạn kiểm soát việc luồng có chờ để lấy khóa hay không.

Nếu blocking được đặt là 0, luồng trả về ngay lập tức với giá trị 0 nếu không thể lấy khóa và 1 nếu khóa đã được lấy. Nếu blocking là 1, luồng sẽ chờ và đợi khóa được giải phóng.

Phương thức release() của đối tượng khóa mới được dùng để giải phóng khóa khi không còn cần thiết.

Ví dụ

#!/usr/bin/python
import threading
import time

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):
        print "Starting " + self.name
        # Lấy khóa để đồng bộ hóa luồng
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # Giải phóng khóa để luồng tiếp theo chạy
        threadLock.release()

def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

threadLock = threading.Lock()
threads = []

# Tạo luồng mới
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Khởi động luồng mới
thread1.start()
thread2.start()

# Thêm luồng vào danh sách
threads.append(thread1)
threads.append(thread2)

# Chờ tất cả luồng hoàn thành
for t in threads:
    t.join()

print "Exiting Main Thread"

Khi mã trên được thực thi, nó cho kết quả sau:

Starting Thread-1
Starting Thread-2
Thread-1: Thu Mar 21 09:11:28 2013
Thread-1: Thu Mar 21 09:11:29 2013
Thread-1: Thu Mar 21 09:11:30 2013
Thread-2: Thu Mar 21 09:11:32 2013
Thread-2: Thu Mar 21 09:11:34 2013
Thread-2: Thu Mar 21 09:11:36 2013
Exiting Main Thread