Python Lập trình đa luồngBy Minh Duc- 0 611 Chạy một số luồng tương tự như chạy một số chương trình khác nhau đồng thời, nhưng với những lợi ích sau: Show
Một chuỗi có một phần mở đầu, một chuỗi thực thi và một phần kết luận.Nó có một con trỏ hướng dẫn theo dõi vị trí mà nó hiện đang chạy trong ngữ cảnh của nó.
Bắt đầu một chuỗi mớiĐể sinh ra một luồng khác, bạn cần gọi phương thức sau có sẵn trongmô-đunluồng thread.start_new_thread ( function, args[, kwargs] )Lệnh gọi phương thức này cho phép một cách nhanh chóng và hiệu quả để tạo các luồng mới trong cả Linux và Windows. Lời gọi phương thức trả về ngay lập tức và luồng con bắt đầu và gọi hàm với danh sách cácargs đã truyền.Khi hàm trả về, chuỗi kết thúc. Ở đây,argslà một loạt các đối số;sử dụng một bộ giá trị trống để gọi hàm mà không chuyển bất kỳ đối số nào.kwargslà một từ điển tùy chọn của các đối số từ khóa. Thí dụ!/usr/bin/pythonimport threadimport timeDefine a function for the threaddef print_time( threadName, delay): count = 0 while count < 5: time.sleep(delay) count += 1 print "%s: %s" % ( threadName, time.ctime(time.time()) )#Create two threads as followstry: thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread.start_new_thread( print_time, ("Thread-2", 4, ) ) except: print "Error: unable to start thread"while 1: pass Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau: Thread-1: Thu Jan 22 15:42:17 2009Thread-1: Thu Jan 22 15:42:19 2009 Thread-2: Thu Jan 22 15:42:19 2009 Thread-1: Thu Jan 22 15:42:21 2009 Thread-2: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:23 2009 Thread-1: Thu Jan 22 15:42:25 2009 Thread-2: Thu Jan 22 15:42:27 2009 Thread-2: Thu Jan 22 15:42:31 2009 Thread-2: Thu Jan 22 15:42:35 2009 Mặc dù nó rất hiệu quả đối với phân luồng cấp thấp, nhưngmô-đunluồngrất hạn chế so với mô-đun luồng mới hơn. CácThreadingMô-đunMô-đun luồng mới hơn được bao gồm trong Python 2.4 cung cấp hỗ trợ cấp cao, mạnh mẽ hơn nhiều cho các luồng so với mô-đun luồng được thảo luận trong phần trước. Cácluồngmô-đun cho thấy tất cả các phương pháp củachủ đềmô-đun và cung cấp một số phương pháp bổ sung
Ngoài các phương pháp, mô-đun threading cóChủ đềlớp mà thực hiện luồng.Các phương thức được cung cấp bởilớpThreadnhư sau:
Tạo chủ đề bằngmô-đunphân luồngĐể triển khai một luồng mới bằng cách sử dụng mô-đun luồng, bạn phải làm như sau:
Khi bạn đã tạolớp conThreadmới, bạn có thể tạo một thể hiện của nó và sau đó bắt đầu một luồng mới bằng cách gọistart (), lần lượt gọiphương thứcrun (). Thí dụ!/usr/bin/pythonimport threadingimport timeexitFlag = 0class 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 print_time(self.name, 5, self.counter) print "Exiting " + self.namedef print_time(threadName, counter, delay): while counter: if exitFlag: threadName.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1#Create new threadsthread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)#Start new Threadsthread1.start() thread2.start()print "Exiting Main Thread" Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau: Starting Thread-1 StartingThread-2 Exiting Main Thread Thread-1: Thu Mar 21 09:10:03 2013 Thread-1: Thu Mar 21 09:10:04 2013 Thread-2: Thu Mar 21 09:10:04 2013 Thread-1: Thu Mar 21 09:10:05 2013 Thread-1: Thu Mar 21 09:10:06 2013 Thread-2: Thu Mar 21 09:10:06 2013 Thread-1: Thu Mar 21 09:10:07 2013 Exiting Thread-1 Thread-2: Thu Mar 21 09:10:08 2013 Thread-2: Thu Mar 21 09:10:10 2013 Thread-2: Thu Mar 21 09:10:12 2013 Exiting Thread-2 Đồng bộ hóa chủ đềMô-đun phân luồng được cung cấp với Python bao gồm cơ chế khóa đơn giản để triển khai 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ọiphương thứcLock (), phương thức này sẽ trả về khóa mới. Phương thứcthu được (chặn)của đối tượng khóa mới được sử dụng để buộc các luồng chạy đồng bộ.Tham sốchặntùy chọncho phép bạn kiểm soát xem luồng có chờ lấy khóa hay không. Nếuchặnđược đặt thành 0, chuỗi sẽ trả về ngay lập tức với giá trị 0 nếu không thể lấy được khóa và với giá trị 1 nếu đã có khóa.Nếu chặn được đặt thành 1, chuỗi sẽ chặn và đợi khóa được giải phóng. Phương thứcrelease ()của đối tượng khóa mới được sử dụng để giải phóng khóa khi nó không còn được yêu cầu. Thí dụ!/usr/bin/pythonimport threadingimport timeclass 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 # Get lock to synchronize threads threadLock.acquire() print_time(self.name, self.counter, 3) # Free lock to release next thread threadLock.release()def print_time(threadName, delay, counter): while counter: time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1threadLock = threading.Lock() threads = []#Create new threadsthread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)#Start new Threadsthread1.start() thread2.start()#Add threads to thread listthreads.append(thread1) threads.append(thread2)#Wait for all threads to completefor t in threads: t.join() print "Exiting Main Thread" Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau: Starting Thread-1Starting 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 Hàng đợi ưu tiên đa luồngCácQueuemô-đun cho phép bạn tạo một đối tượng hàng đợi mới có thể tổ chức một số cụ thể của các mặt hàng.Có các phương pháp sau để kiểm soát Hàng đợi:
import threading import timeexitFlag = 0class myThread (threading.Thread): def init(self, threadID, name, q): threading.Thread.init(self) self.threadID = threadID self.name = name self.q = q def run(self): print "Starting " + self.name process_data(self.name, self.q) print "Exiting " + self.namedef process_data(threadName, q): while not exitFlag: queueLock.acquire() if not workQueue.empty(): data = q.get() queueLock.release() print "%s processing %s" % (threadName, data) else: queueLock.release() time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"] nameList = ["One", "Two", "Three", "Four", "Five"] queueLock = threading.Lock() workQueue = Queue.Queue(10) threads = [] threadID = 1#Create new threadsfor tName in threadList: thread = myThread(threadID, tName, workQueue) thread.start() threads.append(thread) threadID += 1#Fill the queuequeueLock.acquire() for word in nameList: workQueue.put(word) queueLock.release()#Wait for queue to emptywhile not workQueue.empty(): pass#Notify threads it's time to exitexitFlag = 1#Wait for all threads to completefor t in threads: t.join() print "Exiting Main Thread" Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau: Starting Thread-1Starting Thread-2 Starting Thread-3 Thread-1 processing One Thread-2 processing Two Thread-3 processing Three Thread-1 processing Four Thread-2 processing Five Exiting Thread-3 Exiting Thread-1 Exiting Thread-2 Exiting Main Thread Khóa học PYTHON (IPD2020) cho người mới bắt đầu Facebook Twitter Pinterest WhatsApp Previous articlePython OOP Next articlePython Xử lý XML https://laptrinhvien.net/ |