Mục lục
Dẫn nhập bài toán.
Nếu là dân IT thì chúng ta chắc là chúng ta đã được làm quen với khái niệm đa luồng dưới mái trường đại học, khi học về hệ điều hành… Khi đi làm chắc cũng có nhiều người cũng đỗ mồ hôi trán với nó.
Ở bài viết này mình thử làm một bài tập đơn giản về xử lý đa luồng.
Về xử lý đa luồng thì thực tế nó cũng giống như xử lý đơn luồng mà thôi. Nó chỉ gặp rắc rối khi các luồng đó cùng truy cập sử dụng chung 1 tài nguyên nào đó như File hay là Speaker… Cũng như thế giới thực bên ngoài, lúc còn là sinh viên đầu tháng có tiền thì mỗi thằng một điếu 3 số phì phà. Đến cuối tháng hết tiền chỉ còn 1 điếu thuốc mà 2 thằng đều muốn hút. Vậy là cứ thay phiên nhau mỗi thằng kéo một hơi.
Và đa luồng cũng thế, khi cần truy cập vào cùng một File hay một record trong DB thì cũng diễn ra như vậy. Thay phiên tuần tự mà thôi.
Khi nói về thay phiên tuần tự, chúng ta có thể liên tưởng tới hàng đợi. Giống như xếp hàng mua vé xem seagame, vào trước được trước vào sau thì được sau. (Đôi khi có ngoại lệ, với mấy anh dại gái 🙂 )

Ở source code bên dưới, mình thực hiện xử lý:
①Đọc data từ file in.txt vào Input Queue
②Tạo 2 thread dùng chung data ở Input Queue, lấy từng phần tử trong Input Queue rồi add với tên của thread rồi đổ vào Output Queue.
③Sau khi xứ lý xong thì ghi data của Output Queue xuống file out.txt.
Input data.
Bên dưới là nội dung của file c:/learn_python/in.txt chứa data đầu vào.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Source code.
import threading
#Lưu ý với python 2.x thì là import Queue, python 3.x import queue
import queue
import time
#Khai báo 1 đối tượng queue.
inQueue = queue.Queue()
outQueue = queue.Queue()
def inPutTasks():
with open('c:/learn_python/in.txt') as inFile:
contents = inFile.readline()
inQueue.put(contents)
while contents:
contents = inFile.readline()
inQueue.put(contents)
# Khai báo Fuction xử lý add string vào Queue
def processTask(name):
while not inQueue.empty():
value = inQueue.get()
outQueue.put(name + ":" + value)
time.sleep(0.16)
# Khai báo Fuction xử lý ghi giá trị của Queue xuống File.
def outPutTasks():
# sleep 3s để đợi các thread khác xứ lý xong rồi xuất ra file.
time.sleep(3)
with open('c:/learn_python/out.txt', "w") as outFile:
while not outQueue.empty():
msg = outQueue.get()
print(msg)
outFile.write(msg)
# Khai báo thread ghi file
outThread = threading.Thread(target=outPutTasks)
# Khai báo thread lấy data từ file in.txt
inThread = threading.Thread(target=inPutTasks)
# Khai báo thread A
threadA = threading.Thread(target=processTask, args=("a",))
# Khai báo thread B
threadB = threading.Thread(target=processTask, args=("b",))
# Start thread
inThread.start()
threadA.start()
# Dừng xử lý 0.02s để tạo độ lệch xử lý
time.sleep(0.02)
threadB.start()
outThread.start()
# Đợi thread kết thúc.
outThread.join()
Output data.
Bên dưới là nội dung của file c:/learn_python/out.txt chứa data đầu ra khi các thread xử lý xong.
a:1 b:2 a:3 b:4 b:5 a:6 a:7 b:8 a:9 b:10 a:11 b:12 a:13 b:14 a:15 b:16 b:17 a:18 a:19 b:10