Latest Post

🚨 BẢO MẬT WEB THỜI ĐẠI AI: HACKER DÙNG AI, BẠN VẪN BẢO VỆ WEBSITE THEO CÁCH CŨ? 🚨 CẢNH BÁO BẢO MẬT: HACKER CÓ THỂ ĐANG NHẮM ĐẾN FILE config.php CHỨA MẬT KHẨU DATABASE! UEFI Package sử dụng thư viện xử lý hình ảnh có rất nhiều lỗ hỏng bảo mật. Wireless LAN Router của ELECOM có lỗ hỏng bảo mật OS Command injection Note: setting days for Crontab Launching AWS EC2 Instance using Python Tự động phát hành SSL Certificate hết hạn Let’s Encrypt Verify if crontab works Cách xem thời hạn của Let’s Encrypt SSL Certificate AWS EC2 Instance: jum update failure: repodata/repomd.xml from rpmforge: [Errno 256] No more mirrors to try. Nhập môn Python: Chương 2 Hello World thử viết chương trình python đơn giản. Python – Anaconda: Cài đặt Anaconda môi trường lập trình python Nhập môn Python: Chương 1 Python là gì? MySQL – GRANT: Tạo user, set lại password, xem và cấp quyền cho user. Python – Multithread – Queue – File: Xử lý đa luồng dùng chung dữ liệu trên cùng một file dùng hàng đợi(Queue) ⑤Ubuntu – Postfix – Dovecot : Mail server setting, một phát ăn ngay . ④Ubuntu – Postfix – Dovecot : SSL/TSL security mail server setting, một phát ăn ngay. ③Ubuntu – Postfix – Dovecot : Mail server setting, một phát ăn ngay. ②Ubuntu – Postfix – Dovecot : Mail server setting, một phát ăn ngay. ① Ubuntu – Postfix – Dovecot : Mail server setting, một phát ăn ngay. Python – Pandas: lấy data từ file csv. Newbie – Python – Selenium: Tự động login Facebook với trình duyệt Chrome Newbie – Python – Skype: Gửi Message tới Skype chat group hoặc user bằng ngôn ngữ Python. Newbie – Python – PostgreSQL: Kết nối với cơ sở dữ liêu PostgreSQL bằng ngôn ngữ Python. Newbie – Python – SQL Server: Kết nối với cơ sở dữ liệu SQL Server bằng ngôn ngữ Python. Newbie – Python – Mysql: Kết nối với cơ sở dữ liêu MySQL bằng ngôn ngữ Python. Basic Authentication Setting How to setup AWS VPN Client 【GCP】Compute Engine’s Disk Expansion Linux Commands WordPress 404 Page Error (Post)
0 0
Read Time:3 Minute, 12 Second

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

Video hướng dẫn từng bước cụ thể.

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
100 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Leave a Reply

Your email address will not be published. Required fields are marked *