Điều kiện luồng trong python là gì?

Bản tóm tắt. trong hướng dẫn này, bạn sẽ tìm hiểu về các điều kiện chủng tộc và cách sử dụng đối tượng Khóa luồng Python để ngăn chặn chúng

điều kiện chủng tộc là gì

Tình trạng dồn đuổi xảy ra khi hai luồng cố gắng truy cập đồng thời vào một biến được chia sẻ

Chuỗi đầu tiên đọc giá trị từ biến được chia sẻ. Chuỗi thứ hai cũng đọc giá trị từ cùng một biến được chia sẻ

Sau đó, cả hai chủ đề cố gắng thay đổi giá trị của biến được chia sẻ. Và họ đua nhau xem luồng nào ghi giá trị vào biến cuối cùng

Giá trị từ luồng ghi vào biến chia sẻ cuối cùng được giữ nguyên vì nó ghi đè lên giá trị mà luồng trước đó đã viết

Ví dụ về điều kiện cuộc đua

Ví dụ sau minh họa một điều kiện chủng tộc

from threading import Thread from time import sleep counter = 0 def increase(by): global counter local_counter = counter local_counter += by sleep(0.1) counter = local_counter print(f'counter={counter}') # create threads t1 = Thread(target=increase, args=(10,)) t2 = Thread(target=increase, args=(20,)) # start the threads t1.start() t2.start() # wait for the threads to complete t1.join() t2.join() print(f'The final counter is {counter}')

Code language: Python (python)

Trong chương trình này, cả hai luồng đều cố gắng sửa đổi giá trị của biến

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 cùng một lúc. Giá trị của biến

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 phụ thuộc vào chuỗi nào hoàn thành cuối cùng

Nếu luồng

counter=10 counter=20 The counter is 20

Code language: Python (python)
8 hoàn thành trước luồng

counter=10 counter=20 The counter is 20

Code language: Python (python)
9, bạn sẽ thấy đầu ra sau

counter=10 counter=20 The counter is 20

Code language: Python (python)

Nếu không, bạn sẽ thấy đầu ra sau

counter=20 counter=10 The final counter is 10

Code language: Python (python)

Làm thế nào nó hoạt động

Đầu tiên, nhập lớp

counter=20 counter=10 The final counter is 10

Code language: Python (python)
0 từ mô-đun

counter=20 counter=10 The final counter is 10

Code language: Python (python)
1 và hàm

counter=20 counter=10 The final counter is 10

Code language: Python (python)
2 từ mô-đun

counter=20 counter=10 The final counter is 10

Code language: Python (python)
3

from threading import Thread from time import sleep

Code language: Python (python)

Thứ hai, xác định một biến toàn cục có tên là

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 có giá trị bằng không

counter = 0

Code language: Python (python)

Thứ ba, xác định hàm tăng giá trị của biến

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 lên một số

def increase(by): global counter local_counter = counter local_counter += by sleep(0.1) counter = local_counter print(f'counter={counter}')

Code language: Python (python)

Thứ tư, tạo hai chủ đề. Chủ đề đầu tiên tăng

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 lên 10 trong khi chủ đề thứ hai tăng

counter=10 counter=20 The counter is 20

Code language: Python (python)
6 lên 20

t1 = Thread(target=increase, args=(10,)) t2 = Thread(target=increase, args=(20,))

Code language: Python (python)

Thứ năm, bắt đầu chủ đề

t1.start() t2.start()

Code language: Python (python)

Thứ sáu, từ luồng chính, đợi luồng t1 và t2 hoàn thành

t1.join() t2.join()

Code language: Python (python)

Cuối cùng, hiển thị giá trị cuối cùng của biến

counter=10 counter=20 The counter is 20

Code language: Python (python)
6

print(f'The final counter is {counter}')

Code language: Python (python)

Sử dụng Khóa để ngăn điều kiện cuộc đua

Để ngăn chặn điều kiện chủng tộc, bạn có thể sử dụng lớp

counter=20 counter=10 The final counter is 10

Code language: Python (python)
9 từ mô-đun

from threading import Thread from time import sleep

Code language: Python (python)
0. Một khóa có hai trạng thái. bị khóa và mở khóa

Đầu tiên, tạo một thể hiện của lớp

counter=20 counter=10 The final counter is 10

Code language: Python (python)
9

counter=10 counter=20 The counter is 20

Code language: Python (python)
0

Theo mặc định, khóa có trạng thái mở khóa cho đến khi bạn mua nó

Thứ hai, lấy khóa bằng cách gọi phương thức

from threading import Thread from time import sleep

Code language: Python (python)
2

counter=10 counter=20 The counter is 20

Code language: Python (python)
1

Thứ ba, giải phóng khóa sau khi chuỗi hoàn thành việc thay đổi biến được chia sẻ

counter=10 counter=20 The counter is 20

Code language: Python (python)
2

Ví dụ sau đây cho thấy cách sử dụng đối tượng

counter=20 counter=10 The final counter is 10

Code language: Python (python)
9 để ngăn điều kiện chạy đua trong chương trình trước

Ví dụ về phân luồng trong Python là gì?

Chủ đề là gì? . Điều này có nghĩa là chương trình của bạn sẽ có hai việc xảy ra cùng một lúc. Nhưng đối với hầu hết các triển khai Python 3, các luồng khác nhau không thực sự thực thi cùng một lúc. họ chỉ xuất hiện để

Mô-đun luồng trong Python là gì?

Mô-đun luồng. Phương thức này bắt đầu một chuỗi mới và trả về mã định danh của chuỗi đó . Chuỗi thực thi chức năng "hàm" (hàm là một tham chiếu đến một hàm) với danh sách đối số args (phải là một danh sách hoặc một bộ). Đối số kwargs tùy chọn chỉ định một từ điển các đối số từ khóa.

Làm thế nào là luồng được thực hiện trong Python?

Trong mô-đun luồng, để chạy hoặc thực thi luồng, bạn sử dụng phương thức start(), phương thức này chỉ chịu trách nhiệm chạy luồng. You will also use the join method, which means that wait until all the thread execution is complete.

Bạn có nên sử dụng luồng trong Python không?

Tóm lại, phân luồng trong Python cho phép tạo nhiều luồng trong một quy trình duy nhất, nhưng do GIL, không có luồng nào chạy cùng một lúc. Phân luồng vẫn là một tùy chọn rất tốt khi chạy đồng thời nhiều tác vụ liên kết I/O .