Cải thiện bài viết
Lưu bài viết
Cải thiện bài viết
Lưu bài viết
Đọc
Bàn luận
Đưa ra nhiều luồng trong chương trình và một người muốn giao tiếp hoặc trao đổi dữ liệu một cách an toàn giữa chúng.
Có lẽ cách an toàn nhất để gửi dữ liệu từ luồng này sang luồng khác là sử dụng hàng đợi từ thư viện hàng đợi. Để làm điều này, hãy tạo một thể hiện hàng đợi được chia sẻ bởi các chủ đề. Sau đó, các chủ đề sử dụng các hoạt động put[]
hoặc get[]
để thêm hoặc xóa các mục khỏi hàng đợi như trong mã được đưa ra dưới đây.
Mã số 1:
from
queue
import
Queue
from
threading
import
Thread
get[]
6get[]
7
get[]
6get[]
9
get[]
0 get[]
1
from
threading
import
Thread
get[]
0 get[]
1
get[]
6get[]
7
get[]
2get[]
3 get[]
4get[]
5
get[]
0 from
1
get[]
6from
7from
8 from
9
import
9
Queue
0
queue
2from
8 queue
4
queue
5from
8 queue
7from
8 queue
9from
8import
1
import
2from
8 queue
7from
8 import
6from
8import
1
Có lẽ cách an toàn nhất để gửi dữ liệu từ luồng này sang luồng khác là sử dụng hàng đợi từ thư viện hàng đợi. Để làm điều này, hãy tạo một thể hiện hàng đợi được chia sẻ bởi các chủ đề. Sau đó, các chủ đề sử dụng các hoạt động put[]
hoặc get[]
để thêm hoặc xóa các mục khỏi hàng đợi như trong mã được đưa ra dưới đây.
Mã số 1:
from
queue
import
Queue
from
queue
import
Queue
from
threading
import
Thread
get[]
6get[]
7
get[]
6get[]
9
get[]
0 get[]
1
get[]
0 get[]
1
from
threading
import
Thread
get[]
0 get[]
1
get[]
2get[]
3 get[]
4get[]
5
import
9Thread
0
import
9Thread
2
get[]
6get[]
7
get[]
0 from
1
get[]
6from
7from
8 from
9
queue
2from
8 queue
4
queue
5from
8 queue
7from
8 queue
9from
8import
1
import
2from
8 queue
7from
8 import
6from
8import
1
Các trường hợp hàng đợi đã có tất cả các khóa cần thiết, vì vậy chúng có thể được chia sẻ một cách an toàn bởi nhiều luồng theo yêu cầu. Khi sử dụng hàng đợi, nó có thể hơi khó khăn để điều phối việc tắt máy sản xuất và người tiêu dùng.
Một giải pháp phổ biến cho vấn đề này là dựa vào giá trị Sentinel đặc biệt, khi được đặt trong hàng đợi, khiến người tiêu dùng chấm dứt như trong mã dưới đây:
Mã số 2:
Queue
9from
8 from
1from
2
get[]
2get[]
3 from
7
get[]
2threading
3
get[]
6get[]
27get[]
04get[]
29
import
9get[]
31get[]
04get[]
33get[]
34get[]
35get[]
04get[]
37
get[]
6import
5 from
7import
7 import
8
import
9get[]
04get[]
46
Một tính năng tinh tế của mã trên là người tiêu dùng, khi nhận được giá trị Sentinel đặc biệt, ngay lập tức đặt nó trở lại hàng đợi. Điều này tuyên truyền Sentinel đến các chủ đề của người tiêu dùng khác có thể đang nghe trên cùng một hàng đợi, do đó đóng tất cả chúng xuống từng người khác.
Mặc dù hàng đợi là cơ chế giao tiếp luồng phổ biến nhất, người ta có thể xây dựng các cấu trúc dữ liệu riêng miễn là người ta thêm khóa và đồng bộ hóa cần thiết. Cách phổ biến nhất để làm điều này là bọc các cấu trúc dữ liệu của bạn với một biến điều kiện.
Mã số 3: Xây dựng hàng đợi ưu tiên an toàn chủ đề
get[]
66get[]
04get[]
68
import
Thread
6
import
Thread
8
Thread
9 get[]
00
Có lẽ cách an toàn nhất để gửi dữ liệu từ luồng này sang luồng khác là sử dụng hàng đợi từ thư viện hàng đợi. Để làm điều này, hãy tạo một thể hiện hàng đợi được chia sẻ bởi các chủ đề. Sau đó, các chủ đề sử dụng các hoạt động put[]
hoặc get[]
để thêm hoặc xóa các mục khỏi hàng đợi như trong mã được đưa ra dưới đây.
Mã số 1:
from
queue
import
Queue
from
threading
import
Thread
get[]
6get[]
7
get[]
6get[]
9
get[]
0 get[]
1
from
threading
import
Thread
get[]
0 get[]
1
get[]
6get[]
7
get[]
6from
09
get[]
2get[]
3 get[]
4get[]
5
get[]
0 from
1
get[]
6from
7from
8 from
9
import
9
Queue
0
from
29