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 phân trăn để ngăn chặn chúng.: in this tutorial, you’ll learn about the race conditions and how to use the Python threading Lock object to prevent them.
Tình trạng cuộc đua là gì
Một điều kiện cuộc đua xảy ra khi hai luồng cố gắng truy cập đồng thời một biến được chia sẻ.
Chủ đề đầu tiên đọc giá trị từ biến được chia sẻ. Chủ đề thứ hai cũng đọc giá trị từ cùng một biến được chia sẻ.
Sau đó, cả hai luồng cố gắng thay đổi giá trị của biến được chia sẻ. Và họ đua để xem chủ đề nào viết một giá trị cho biến cuối cùng.
Giá trị từ luồng ghi vào biến được chia sẻ cuối cùng được bảo tồn vì nó ghi đè lên giá trị mà chủ đề trước đó đã viết.
Ví dụ về điều kiện chủng tộc
Ví dụ sau đây minh họa một điều kiện chủng tộc:
Code language: Python [python]
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}']
Trong chương trình này, cả hai luồng đều cố gắng sửa đổi giá trị của biến
6 cùng một lúc. Giá trị của biếnCode language: Python [python]
counter=10 counter=20 The counter is 20
6 phụ thuộc vào luồng nào hoàn thành cuối cùng.Code language: Python [python]
counter=10 counter=20 The counter is 20
Nếu luồng
8 hoàn thành trước luồngCode language: Python [python]
counter=10 counter=20 The counter is 20
9, bạn sẽ thấy đầu ra sau:Code language: Python [python]
counter=10 counter=20 The counter is 20
Code language: Python [python]
counter=10 counter=20 The counter is 20
Nếu không, bạn sẽ thấy đầu ra sau:
Code language: Python [python]
counter=20 counter=10 The final counter is 10
Làm thế nào nó hoạt động.
Đầu tiên, nhập lớp
0 từ mô -đunCode language: Python [python]
counter=20 counter=10 The final counter is 10
1 và hàm
counter=20 counter=10 The final counter is 10
Code language: Python [python]
2 từ mô -đunCode language: Python [python]
counter=20 counter=10 The final counter is 10
3:Code language: Python [python]
counter=20 counter=10 The final counter is 10
Code language: Python [python]
from threading import Thread from time import sleep
Thứ hai, xác định một biến toàn cầu được gọi là
6 có giá trị bằng không:Code language: Python [python]
counter=10 counter=20 The counter is 20
Code language: Python [python]
counter = 0
Thứ ba, xác định một hàm tăng giá trị của biến
6 theo một số:Code language: Python [python]
counter=10 counter=20 The counter is 20
Code language: Python [python]
def increase[by]: global counter local_counter = counter local_counter += by sleep[0.1] counter = local_counter print[f'counter={counter}']
Thứ tư, tạo hai chủ đề. Chủ đề thứ nhất tăng
6 lên 10 trong khi luồng thứ hai tăngCode language: Python [python]
counter=10 counter=20 The counter is 20
6 lên 20:Code language: Python [python]
counter=10 counter=20 The counter is 20
Code language: Python [python]
t1 = Thread[target=increase, args=[10,]] t2 = Thread[target=increase, args=[20,]]
Thứ năm, bắt đầu các chủ đề:
Code language: Python [python]
t1.start[] t2.start[]
Thứ sáu, từ chủ đề chính, đợi các luồng T1 và T2 hoàn thành:
Code language: Python [python]
t1.join[] t2.join[]
Cuối cùng, hiển thị giá trị cuối cùng của biến
6:
counter=10 counter=20 The counter is 20
Code language: Python [python]
Code language: Python [python]
print[f'The final counter is {counter}']
Sử dụng khóa để ngăn chặn tình trạng cuộc đua
Để ngăn chặn các điều kiện chủng tộc, bạn có thể sử dụng lớp
9 từ mô -đunCode language: Python [python]
counter=20 counter=10 The final counter is 10
1. Một khóa có hai trạng thái: khóa và mở khóa.Code language: Python [python]
counter=20 counter=10 The final counter is 10
Đầu tiên, hãy tạo một thể hiện lớp
9:Code language: Python [python]
counter=20 counter=10 The final counter is 10
0Code language: Python [python]
counter=10 counter=20 The counter is 20
Theo mặc định, khóa có trạng thái mở khóa cho đến khi bạn có được nó.
Thứ hai, có được khóa bằng cách gọi phương thức
2:Code language: Python [python]
from threading import Thread from time import sleep
1Code language: Python [python]
counter=10 counter=20 The counter is 20
Thứ ba, hãy giải phóng khóa sau khi luồng hoàn thành thay đổi biến được chia sẻ:
2Code language: Python [python]
counter=10 counter=20 The counter is 20
Ví dụ sau đây cho thấy cách sử dụng đối tượng
9 để ngăn chặn điều kiện chủng tộc trong chương trình trước:Code language: Python [python]
counter=20 counter=10 The final counter is 10
3Code language: Python [python]
counter=10 counter=20 The counter is 20
Output:
4
counter=10 counter=20 The counter is 20
Code language: Python [python]
Làm thế nào nó hoạt động.
- Đầu tiên, nhập lớp
0 từ mô -đun
Code language: Python [python]counter=20 counter=10 The final counter is 10
1 và hàm
Code language: Python [python]counter=20 counter=10 The final counter is 10
2 từ mô -đun
Code language: Python [python]counter=20 counter=10 The final counter is 10
3:
Code language: Python [python]counter=20 counter=10 The final counter is 10
- Thứ hai, xác định một biến toàn cầu được gọi là
6 có giá trị bằng không:
Code language: Python [python]counter=10 counter=20 The counter is 20
-
Code language: Python [python]counter = 0
Thứ ba, xác định một hàm tăng giá trị của biến
6 theo một số:Code language: Python [python]
counter=10 counter=20 The counter is 20
5Code language: Python [python]
counter=10 counter=20 The counter is 20
Thứ tư, tạo hai chủ đề. Chủ đề thứ nhất tăng counter=10
counter=20
The counter is 20
Code language: Python [python]
6 lên 10 trong khi luồng thứ hai tăng counter=10
counter=20
The counter is 20
Code language: Python [python]
6 lên 20:
counter=10
counter=20
The counter is 20
counter=10
counter=20
The counter is 20
- Thứ năm, bắt đầu các chủ đề:
- Thứ sáu, từ chủ đề chính, đợi các luồng T1 và T2 hoàn thành:
- Cuối cùng, hiển thị giá trị cuối cùng của biến
6:
Code language: Python [python]counter=10 counter=20 The counter is 20
- Sử dụng khóa để ngăn chặn tình trạng cuộc đua
Để ngăn chặn các điều kiện chủng tộc, bạn có thể sử dụng lớp
9 từ mô -đunCode language: Python [python]
counter=20 counter=10 The final counter is 10
1. Một khóa có hai trạng thái: khóa và mở khóa.Code language: Python [python]
counter=20 counter=10 The final counter is 10