You are on page 1of 24

Giáo trình Python Cơ Bản

Giới thiệu về Thread, Process


Đa luồng trong Python (multithreading)
1. Giới thiệu về Datetime
2. Giới thiệu Thread. Khác biệt giữa Thread và Process
3. Đa luồng (multithreading) là gì ?
4. Thư viện thread (Python2) và _thread (Python3)
5. Thư viên threading
6. Đồng bộ các thread
7. Quyền ưu tiên Thread

Trang 1
Giáo trình Python Cơ Bản

1. Giới thiệu về xử lý Date/Time

Trang 2
Giáo trình Python Cơ Bản
Python có module time dùng để xử lý các tác vụ liên quan đến thời gian.
Để sử dụng các hàm được xác định trong module, trước tiên hãy import module này vào, thực hiện như
sau: import time
time.time()
Hàm time() trả về số giây tính từ epoch, hay còn gọi là giá trị timestamp. Đối với hệ thống Unix, 00:00:00
ngày 1/1/1970 theo giờ UTC được gọi là epoch (thời điểm bắt đầu thời gian).

time.ctime()
Phương thức này chuyển đổi một time được biểu diễn bằng số giây tính từ epoch thành một biểu diễn
ở dạng chuỗi.

3
Giáo trình Python Cơ Bản
time.sleep()
Hàm sleep() dừng thực thi luồng hiện tại trong số giây truyền vào. Phương thức này không trả về bất cứ giá trị nào
mà chỉ delay trình thực thi. Thử chạy chương trình để thấy rõ khoảng thời gian delay.

time.strftime()
Hàm strftime() trong module time lấy struct_time (hoặc một tuple tương ứng vớis truct_time) làm đối số và trả về một
chuỗi đại diện cho thời gian đó dựa trên code định dạng được truyền vào.

4
Giáo trình Python Cơ Bản

5
Giáo trình Python Cơ Bản

2. Giới thiệu về Thread

Trang 6
Giáo trình Python Cơ Bản

Bạn dùng máy tính hàng ngày, mở hàng chục trang web khác nhau, cùng
một cơ số đếm không xuể các ứng dụng nghe nhạc, xem phim, game ở
ngoài, bạn có tự hỏi vì sao máy tính có thể cân hết chừng đấy việc một lúc
không?
Dường như các chương trình đều phản ứng chỉ trong tích tắc, và đang
chạy đồng thời cùng nhau.
Nhưng thực tế ảo diệu hơn thế nhiều, hóa ra, trong một đơn vị thời gian
(nanosecond), chỉ có một chương trình (process) được chạy.
Và trong chương trình đó, lại chia ra thành nhiều luồn (thread) con, thực
thi cùng một lúc (multithread, ít nhất là trong thời điểm hiện tại), tạo cho
người dùng cảm giác chương trình đang chạy nhanh hơn.
Nhờ khả năng xử lí các task có thể coi như đồng thời (concurrency),
chương trình có thể đáp ứng tốt với người dùng trong khi đang bận làm
việc khác.
Và đó là chính ý tưởng cơ bản của multithread. 7
Giáo trình Python Cơ Bản

Nói về cấu trúc máy tính : Thread là một đơn vị cơ bản trong CPU. Một luồng sẽ chia
sẻ với các luồng khác trong cùng process về thông tin data, các dữ liệu của
mình. Việc tạo ra thread giúp cho các chương trình có thể chạy được nhiều công việc
cùng một lúc

Process là quá trình hoạt động của một ứng dụng. Tiến trình (process)chứa đựng
thông tin tài nguyên, trạng thái thực hiện của chương trình

Thread là một bước điều hành bên trong một process.


Luồng (thread) là một khối các câu lệnh (instructions) độc lập trong một tiến trình và
có thể được lập lịch bởi hệ điều hành.
Hay nói một cách đơn giản, Thread là các hàm hay thủ tục chạy độc lập đối với
chương trình chính.
Một process dĩ nhiên có thể chứa nhiều thread bên trong nó.
Điểm quan trọng nhất cần chú ý là một thread có thể làm bất cứ nhiệm vụ gì một
process có thể làm.
Trang 8
Giáo trình Python Cơ Bản
Một điểm khác biệt nữa đó là nhiều thread nằm trong cùng một process dùng một
không gian bộ nhớ giống nhau, trong khi process thì không.
Điều này cho phép các thread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp
dễ dàng giữa các thread với nhau.
Giao thức giữa các process, hay còn gọi là IPC (inter-process communication) thì
tương đối phức tạp bởi các dữ liệu có tính tập trung sâu hơn.
Ngoài các tài nguyên riêng của mình (các biến cục bộ trong hàm), các luồng chia sẻ
tài nguyên chung của tiến trình.
Việc thay đổi tài nguyên chung (ví dụ, đóng file, gán giá trị mới cho biến) từ một
thread sẽ được nhìn thấy bởi tất cả các thread khác.
Vì vậy, lập trình viên cần phải thực hiện đồng bộ việc truy cập tài nguyên chung giữa
các luồng.

Hình bên dưới minh họa sự khác nhau giữa luồng và tiến trình.
9
Giáo trình Python Cơ Bản

10
Giáo trình Python Cơ Bản

3. Đa luồng
(multithreading) là gì ?

Trang 11
Giáo trình Python Cơ Bản

Process là quá trình hoạt động của một chương trình.


Thread là một bước điều hành bên trong một process. Một process có thể chứa
nhiều thread bên trong nó.
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 (_thread trong Python 3) 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. yield

12
Giáo trình Python Cơ Bản

4. Giới thiệu về thư viên _thread

Trang 13
Giáo trình Python Cơ Bản

Python 2 là thread
Python 3 là _thread

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] )

Phương thức này cho phép một cách nhanh chóng và hiệu quả để tạo các Thread mới
trong cả Linux và Windows.

Phương thức trả về ngay lập tức và luồng con bắt đầu và gọi function với danh sách
các tham số args đã qua. Khi function trả về, luồng 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 ý
14
Giáo trình Python Cơ Bản

import _thread
import time

# Define a function for the thread


def print_time( threadName, delay):
Thread-1: Tue Jun 2 10:52:37 2020
count = 0 Thread-2: Tue Jun 2 10:52:39 2020
while count < 5:
time.sleep(delay)
Thread-1: Tue Jun 2 10:52:39 2020
count += 1 Thread-1: Tue Jun 2 10:52:41 2020
print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
Thread-2: Tue Jun 2 10:52:43 2020
# Create two threads as follows Thread-1: Tue Jun 2 10:52:43 2020
try:
_thread.start_new_thread( print_time, ("Thread-1", 2, ) )
Thread-1: Tue Jun 2 10:52:45 2020
_thread.start_new_thread( print_time, ("Thread-2", 4, ) ) Thread-2: Tue Jun 2 10:52:47 2020
except:
print ("Error: unable to start thread")
Thread-2: Tue Jun 2 10:52:51 2020
Thread-2: Tue Jun 2 10:52:55 202
while 1:
pass

15
Giáo trình Python Cơ Bản

5. Giới thiệu về thư viên threading

Trang 16
Giáo trình Python Cơ Bản

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.

17
Giáo trình Python Cơ Bản
import threading
import time
Starting Thread-1
exitFlag = 0
class myThread (threading.Thread):
Starting Thread-2
def __init__(self, threadID, name, counter): Số lượng threading 3
threading.Thread.__init__(self)
self.threadID = threadID Thread-1 isAlive: True
self.name = name
self.counter = counter Thread-2 isAlive: True
def run(self):
print ("Starting " + self.name) Thread-1: Tue Jun 2 12:06:38 2020
print_time(self.name, self.counter, 5)
print ("Exiting " + self.name)
Thread-2: Tue Jun 2 12:06:39 2020
Thread-1: Tue Jun 2 12:06:39 2020
def print_time(threadName, delay, counter):
while counter: Thread-1: Tue Jun 2 12:06:40 2020
if exitFlag:
threadName.exit() Thread-2: Tue Jun 2 12:06:41 2020
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
Thread-1: Tue Jun 2 12:06:41 2020
counter -= 1 Thread-1: Tue Jun 2 12:06:42 2020
# Create new threads Exiting Thread-1
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2) Thread-2: Tue Jun 2 12:06:43 2020
# Start new Threads Thread-2: Tue Jun 2 12:06:45 2020
thread1.start()
thread2.start() Thread-2: Tue Jun 2 12:06:47 2020
print(f"Số lượng threading {threading.activeCount()}")
print(f"Thread-1 isAlive: {thread1.isAlive()}")
Exiting Thread-2
print(f"Thread-2 isAlive: {thread2.isAlive()}") Thread-1 isAlive: False
thread1.join()
thread2.join() Thread-2 isAlive: False
print(f"Thread-1 isAlive: {thread1.isAlive()}")
print(f"Thread-2 isAlive: {thread2.isAlive()}") Exiting Main Thread
print("Exiting Main Thread")

18
Giáo trình Python Cơ Bản

6. Đồng bộ Thread

Trang 19
Giáo trình Python Cơ Bản

Python cung cấp threading Module, mà bao gồm một kỹ thuật locking cho phép bạn
đồng bộ hóa các Thread một cách dễ dàng. Một lock mới được tạo bởi gọi phương
thức Lock().

Phương thức acquire(blocking) của đối tượng lock mới này được sử dụng để ép các
Thread chạy một cách đồng bộ. Tham số blocking tùy ý cho bạn khả năng điều khiển
để xem một Thread có cần đợi để đạt được lock hay không.

Nếu tham số blocking được thiết lập là 0, tức là Thread ngay lập tức trả về một giá trị 0
nếu không thu được lock và trả về giá trị 1 nếu thu được lock. Nếu blocking được thiết
lập là 1, thì Thread cần đợi cho đến khi lock được giải phóng.

Phương thức release() của đối tượng lock được sử dụng để giải phóng lock khi nó
không cần nữa. 20
Giáo trình Python Cơ Bản
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) Starting Thread-1
# Get lock to synchronize threads
threadLock.acquire()
Starting Thread-2
print_time(self.name, self.counter, 3) Thread-1: Tue Jun 2 12:14:03 2020
# Free lock to release next thread
threadLock.release() Thread-1: Tue Jun 2 12:14:04 2020
def print_time(threadName, delay, counter):
while counter:
Thread-1: Tue Jun 2 12:14:05 2020
time.sleep(delay) Thread-2: Tue Jun 2 12:14:07 2020
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1 Thread-2: Tue Jun 2 12:14:09 2020
threadLock = threading.Lock()
threads = []
Thread-2: Tue Jun 2 12:14:11 2020
# Create new threads Exiting Main Thread
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")

21
Giáo trình Python Cơ Bản

7. Độ ưu tiên Thread

Trang 22
Giáo trình Python Cơ Bản

Queue Module cho phép bạn tạo một đối tượng queue mới mà có thể giữ một số
lượng item nào đó. Dưới đây là các phương thức:
get(): Xóa và trả về một item từ queue.
put(): Thêm một item tới một queue.
qsize() : Trả về số item mà hiện tại đang trong queue.
empty(): Trả về true nếu queue là trống, nếu không thì trả về false.
full(): Trả về true nếu queue là đầy, nếu không thì trả về false.

23
Giáo trình Python Cơ Bản

Hey!
Coding
is easy!

END

Trang 24

You might also like