(+84) 236.3827111 ex. 402

Xử lý đa luồng trong Python


Một chương trình đa luồng chứa hai hoặc nhiều phần mà có thể chạy đồng thời và mỗi phần có thể xử lý tác vụ khác nhau tại cùng một thời điểm, để sử dụng tốt nhất các nguồn có sẵn, đặc biệt khi máy tính của bạn có nhiều CPU.

Python cung cấp thread Module và threading Module để bạn có thể bắt đầu một thread mới cũng như một số tác vụ khác trong khi lập trình đa luồng. Mỗi một Thread đều có vòng đời chung là bắt đầu, chạy và kết thúc. Một Thread có thể bị ngắt (interrupt), hoặc tạm thời bị dừng (sleeping) trong khi các Thread khác đang chạy – được gọi là yielding.

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

Phương thức dưới đây có sẵn trong thread Module được sử dụng để bắt đầu một Thread mới:

thread.start_new_thread ( function, args[, kwargs] )

Lời gọi phương thức này được trả về ngay lập tức và Thread con bắt đầu và gọi hàm function với danh sách các tham số args đã truyền. Khi hàm function trả về, thì Thread kết thúc.

Ở đây, args là một Tuple của các tham số, sử dụng một Tuple trống để gọi hàm function mà không truyền cho nó bất kỳ tham số nào. Tham số kwargs là một Dictionary của các tham số từ khóa tùy ý. (bạn thao khảo chương Hàm trong Python để biết chi tiết tham số từ khóa là gì)

Ví dụ

 import thread
import time# Dinh nghia mot ham cho thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )# 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 quả 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 rất hiệu quả với đa luồng tầm thấp nhưng khi so sánh với threading Module thì nó có nhiều điểm hạn chế. Phần tiếp theo giới thiệu về threading Module.

threading Module trong Python

Module mới này được bao với Python 2.4 nhằm cung cấp nhiều hỗ trợ mạnh mẽ và cấp độ cao hơn cho các Thread trong khi so sánh với thread Module ở trên. Ngoài các phương thức có trong thread Module, thì threading Module còn bổ sung thêm một số phương thức khác, đó là:

  • threading.activeCount(): Trả về số đối tượng thread mà là active.

  • threading.currentThread(): Trả về số đối tượng thread trong Thread control của Caller.

  • threading.enumerate(): Trả về một danh sách tất cả đối tượng thread mà hiện tại là active.

Bên cạnh đó, threading Module có lớp Thread để triển khai đa luồng. Lớp này có các phương thức sau:

  • run(): Là entry point cho một Thread.

  • start(): Bắt đầu một thread bởi gọi phương thức run().

  • join([time]): Đợi cho các thread kết thúc.

  • isAlive(): Kiểm tra xem một thread có đang thực thi hay không.

  • getName(): Trả về tên của một thread.

  • setName(): Thiết lập tên của một thread.