1. Trang chủ
  2. » Thể loại khác

multithread trong python

10 271 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Đa luồng (Multithread) trong Python

    • Bắt đầu một Thread mới trong Python

      • Ví dụ

    • threading Module trong Python

    • Tạo Thread bởi sử dụng threading Module trong Python

      • Ví dụ

    • Đồng bộ hóa các Thread trong Python

      • Ví dụ

    • Queue Module: quyền ưu tiên đa luồng trong Python

      • Ví dụ

Nội dung

http://vietjack.com/python/index.jsp Copyright © vietjack.com Đa luồng (Multithread) Python Một chương trình đa luồng chứa hai nhiều phần mà chạy đồng thời phần xử lý tác vụ khác thời điểm, để sử dụng tốt nguồn có sẵn, đặc biệt máy tính bạn có nhiều CPU Python cung cấp thread Module threading Module để bạn bắt đầu thread số tác vụ khác lập trình đa luồng Mỗi Thread có vòng đời chung bắt đầu, chạy kết thúc Một Thread bị ngắt (interrupt), tạm thời bị dừng (sleeping) Thread khác chạy – gọi yielding Bắt đầu Thread Python Phương thức có sẵn thread Module sử dụng để bắt đầu Thread mới: thread.start_new_thread ( function, args[, kwargs] ) Lời gọi phương thức trả Thread bắt đầu gọi hàmfunction với danh sách tham số args truyền Khi hàm function trả về, Thread kết thúc Ở đây, args Tuple tham số, sử dụng Tuple trống để gọi hàm function mà không truyền cho tham số Tham số kwargs Dictionary tham số từ khóa tùy ý (bạn thao khảo chương Hàm Python để biết chi tiết tham số từ khóa gì) Ví dụ import thread import time # Dinh nghia mot ham cho thread def print_time( threadName, delay): count = while count < 5: time.sleep(delay) count += print "%s: %s" % ( threadName, time.ctime(time.time()) ) http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com # Tao hai thread nhu sau try: thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread.start_new_thread( print_time, ("Thread-2", 4, ) ) except: print "Error: khong the bat dau thread" while 1: pass Kết là: Thread-1: Mon Nov 21 15:42:17 2015 Thread-1: Mon Nov 21 15:42:19 2015 Thread-2: Mon Nov 21 15:42:19 2015 Thread-1: Mon Nov 21 15:42:21 2015 Thread-2: Mon Nov 21 15:42:23 2015 Thread-1: Mon Nov 21 15:42:23 2015 Thread-1: Mon Nov 21 15:42:25 2015 Thread-2: Mon Nov 21 15:42:27 2015 Thread-2: Mon Nov 21 15:42:31 2015 Thread-2: Mon Nov 21 15:42:35 2015 Mặc dù thread Module hiệu với đa luồng tầm thấp so sánh với threadingModule có nhiều điểm hạn chế Phần giới thiệu threading Module threading Module Python Module bao với Python 2.4 nhằm cung cấp nhiều hỗ trợ mạnh mẽ cấp độ cao cho Thread so sánh với thread Module Ngồi phương thức có thread Module, threading Module bổ sung thêm số phương thức khác, là:  threading.activeCount(): Trả số đối tượng thread mà active  threading.currentThread(): Trả số đối tượng thread Thread control Caller http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp  Copyright © vietjack.com threading.enumerate(): Trả danh sách tất đối tượng thread mà active Bên cạnh đó, threading Module có lớp Thread để triển khai đa luồng Lớp có phương thức sau:  run(): Là entry point cho Thread  start(): Bắt đầu thread gọi phương thức run()  join([time]): Đợi cho thread kết thúc  isAlive(): Kiểm tra xem thread có thực thi hay không  getName(): Trả tên thread  setName(): Thiết lập tên thread Tạo Thread sử dụng threading Module Python Để triển khai thread sử dụng threading Module, bạn phải thực hiện:  Định nghĩa lớp lớp Thread  Ghi đè phương thức init (self [,args]) để bổ sung thêm tham số  Sau đó, ghi đè phương thức run(self [,args]) để triển khai thread cần thực bắt đầu Một bạn tạo lớp Thread mới, bạn tạo instance sau bắt đầu Thread triệu hồi phương thức start() Ví dụ import threading import time exitFlag = http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com 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 "Bat dau " + self.name print_time(self.name, self.counter, 5) print "Ket thuc " + self.name def print_time(threadName, delay, counter): while counter: if exitFlag: threadName.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= # Tao cac thread moi thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # Bat dau cac thread moi thread1.start() thread2.start() print "Ket thuc Main Thread" Kết là: Bat dau Thread-1 Bat dau Thread-2 Ket thuc Main Thread http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Thread-1: Mon Nov 21 09:10:03 2015 Thread-1: Mon Nov 21 09:10:04 2015 Thread-2: Mon Nov 21 09:10:04 2015 Thread-1: Mon Nov 21 09:10:05 2015 Thread-1: Mon Nov 21 09:10:06 2015 Thread-2: Mon Nov 21 09:10:06 2015 Thread-1: Mon Nov 21 09:10:07 2015 Ket thuc Thread-1 Thread-2: Mon Nov 21 09:10:08 2015 Thread-2: Mon Nov 21 09:10:10 2015 Thread-2: Mon Nov 21 09:10:12 2015 Ket thuc Thread-2 Đồng hóa Thread Python Python cung cấp threading Module, mà bao gồm kỹ thuật locking cho phép bạn đồng hóa Thread cách dễ dàng Một lock tạo gọi phương thức Lock() Phương thức acquire(blocking) đối tượng lock sử dụng để ép Thread chạy cách đồng Tham số blocking tùy ý cho bạn khả điều khiển để xem Thread có cần đợi để đạt lock hay không Nếu tham số blocking thiết lập 0, tức Thread trả giá trị không thu lock trả giá trị thu lock Nếu blocking thiết lập 1, Thread cần đợi lock giải phóng Phương thức release() đối tượng lock sử dụng để giải phóng lock khơng cần Ví dụ import threading import time class myThread (threading.Thread): def init (self, threadID, name, counter): http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com threading.Thread. init (self) self.threadID = threadID self.name = name self.counter = counter def run(self): print "Bat dau " + self.name # Lay lock de dong bo hoa cac thread threadLock.acquire() print_time(self.name, self.counter, 3) # Giai phong lock cho thread ke tiep threadLock.release() def print_time(threadName, delay, counter): while counter: time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= threadLock = threading.Lock() threads = [] # Tao cac thread moi thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # Bat dau cac thread moi thread1.start() thread2.start() # Them cac thread vao list threads.append(thread1) threads.append(thread2) http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com # Doi cho tat ca thread ket thuc for t in threads: t.join() print "Ket thuc Main Thread" Kết là: Bat dau Thread-1 Bat dau Thread-2 Thread-1: Mon Nov 21 09:11:28 2015 Thread-1: Mon Nov 21 09:11:29 2015 Thread-1: Mon Nov 21 09:11:30 2015 Thread-2: Mon Nov 21 09:11:32 2015 Thread-2: Mon Nov 21 09:11:34 2015 Thread-2: Mon Nov 21 09:11:36 2015 Ket thuc Main Thread Queue Module: quyền ưu tiên đa luồng Python Queue Module cho phép bạn tạo đối tượng queue mà giữ số lượng item Dưới phương thức:  get(): Xóa trả item từ queue  put(): Thêm item tới queue  qsize() : Trả số item mà queue  empty(): Trả true queue trống, khơng trả false  full(): Trả true queue đầy, khơng trả false Ví dụ import Queue import threading import time http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com exitFlag = class 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 "Bat dau " + self.name process_data(self.name, self.q) print "Ket thuc " + self.name def process_data(threadName, q): while not exitFlag: queueLock.acquire() if not workQueue.empty(): data = q.get() queueLock.release() print "%s dang xu ly %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 = # Tao cac thread moi http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com for tName in threadList: thread = myThread(threadID, tName, workQueue) thread.start() threads.append(thread) threadID += # Dien vao queue queueLock.acquire() for word in nameList: workQueue.put(word) queueLock.release() # Doi den queue la while not workQueue.empty(): pass # Thong bao cho thread la thoi gian de ket thuc exitFlag = # Doi cho tat ca thread ket thuc for t in threads: t.join() print "Ket thuc Main Thread" Kết là: Bat dau Thread-1 Bat dau Thread-2 Bat dau Thread-3 Thread-1 dang xu ly One Thread-2 dang xu ly Two Thread-3 dang xu ly Three Thread-1 dang xu ly Four Thread-2 dang xu ly Five Ket thuc Thread-3 http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Ket thuc Thread-1 Ket thuc Thread-2 Ket thuc Main Thread http://vietjack.com/ Trang chia sẻ học online miễn phí Page 10 ... threadingModule có nhiều điểm hạn chế Phần giới thiệu threading Module threading Module Python Module bao với Python 2.4 nhằm cung cấp nhiều hỗ trợ mạnh mẽ cấp độ cao cho Thread so sánh với thread... Mon Nov 21 09:10:10 2015 Thread-2: Mon Nov 21 09:10:12 2015 Ket thuc Thread-2 Đồng hóa Thread Python Python cung cấp threading Module, mà bao gồm kỹ thuật locking cho phép bạn đồng hóa Thread cách... control Caller http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com /python/ index.jsp  Copyright © vietjack.com threading.enumerate(): Trả danh sách tất đối tượng thread

Ngày đăng: 02/12/2017, 12:28

TỪ KHÓA LIÊN QUAN