Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả quy trình và luồng đều được tạo và quản lý bởi hệ điều hành bên dưới
Đôi khi, chúng tôi có thể cần tạo các luồng bổ sung trong chương trình của mình để thực thi mã đồng thời
Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô-đun luồng và luồng. lớp chủ đề
Bạn có thể tìm hiểu thêm về Python thread trong hướng dẫn
- Luồng trong Python. Hướng dẫn hoàn chỉnh
Trong lập trình đồng thời trong các luồng, đôi khi chúng ta cần phối hợp các luồng với một biến boolean. Điều này có thể là để kích hoạt một hành động hoặc báo hiệu một số kết quả
Điều này có thể đạt được với khóa loại trừ lẫn nhau [mutex] và biến boolean, nhưng không cung cấp cách nào để luồng chờ biến được đặt thành True
Thay vào đó, điều này có thể đạt được bằng cách sử dụng một đối tượng sự kiện
Đối tượng sự kiện là gì và chúng ta có thể sử dụng nó như thế nào trong Python?
Chạy các vòng lặp của bạn bằng cách sử dụng tất cả các CPU, tải xuống cuốn sách MIỄN PHÍ của tôi để tìm hiểu cách thực hiện
Cách sử dụng một đối tượng sự kiện
Python cung cấp một đối tượng sự kiện thông qua luồng. lớp sự kiện
Một sự kiện là một nguyên thủy đồng thời đơn giản cho phép giao tiếp giữa các luồng
một luồng. Đối tượng sự kiện bao bọc một biến boolean có thể là “đặt” [Đúng] hoặc “không đặt” [Sai]. Các chủ đề chia sẻ phiên bản sự kiện có thể kiểm tra xem sự kiện đã được đặt chưa, đặt sự kiện, xóa sự kiện [không đặt sự kiện] hoặc đợi sự kiện được đặt
các luồng. Sự kiện cung cấp một cách dễ dàng để chia sẻ một biến boolean giữa các luồng có thể hoạt động như một trình kích hoạt cho một hành động
Đây là một trong những cơ chế đơn giản nhất để giao tiếp giữa các luồng. một luồng báo hiệu một sự kiện và các luồng khác chờ đợi nó
— Đối tượng sự kiện, phân luồng — Tính song song dựa trên luồng
Trước tiên, một đối tượng sự kiện phải được tạo và sự kiện sẽ ở trạng thái “chưa đặt”
1
2
3
.. .
# tạo một thể hiện của một sự kiện
sự kiện = phân luồng. Sự kiện[]
Sau khi tạo, chúng ta có thể kiểm tra xem sự kiện đã được đặt chưa thông qua hàm is_set[] sẽ trả về True nếu sự kiện được đặt hoặc Sai nếu không
Ví dụ
1
2
3
4
.. .
# kiểm tra xem sự kiện đã được đặt chưa
nếu sự kiện. is_set[].
# làm việc gì đó
Sự kiện có thể được thiết lập thông qua hàm set[]. Bất kỳ chủ đề nào đang chờ sự kiện được đặt sẽ được thông báo
Ví dụ
1
2
3
.. .
# đặt sự kiện
sự kiện. đặt[]
Sự kiện có thể được đánh dấu là “chưa được đặt” [cho dù nó có được đặt hay không] thông qua hàm clear[]
1
2
3
.. .
# đánh dấu sự kiện là chưa được đặt
sự kiện. xóa[]
Cuối cùng, các chủ đề có thể đợi sự kiện được thiết lập thông qua hàm wait[]. Gọi hàm này sẽ chặn cho đến khi sự kiện được đánh dấu là đã đặt [e. g. một luồng khác gọi hàm set[]]. Nếu sự kiện đã được đặt, hàm wait[] sẽ trả về ngay lập tức
1
2
3
.. .
# chờ sự kiện được thiết lập
sự kiện. chờ đã[]
Từ việc xem xét mã nguồn để phân luồng. Sự kiện, luồng chờ chỉ được thông báo khi hàm set[] được gọi, không phải khi hàm clear[] được gọi
Đối số “hết thời gian chờ” có thể được chuyển đến hàm wait[], hàm này sẽ giới hạn thời gian một chuỗi sẵn sàng đợi trong vài giây để sự kiện được đánh dấu là đã đặt
Hàm wait[] sẽ trả về True nếu sự kiện được đặt trong khi chờ, nếu không, giá trị Sai được trả về cho biết rằng sự kiện chưa được đặt và cuộc gọi đã hết thời gian chờ
1
2
3
.. .
# chờ sự kiện được đặt với thời gian chờ
sự kiện. chờ đã[hết thời gian=10]
Bây giờ chúng ta đã biết cách sử dụng một luồng. Sự kiện, hãy xem một ví dụ đã hoạt động
Bối rối với API mô-đun phân luồng?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi
Ví dụ về việc sử dụng một đối tượng sự kiện
Chúng ta có thể khám phá cách sử dụng một luồng. đối tượng sự kiện
Trong ví dụ này, chúng tôi sẽ tạo một bộ chuỗi mà mỗi chuỗi sẽ thực hiện một số xử lý và báo cáo một thông báo. Tất cả các chủ đề sẽ sử dụng một sự kiện để chờ thiết lập trước khi bắt đầu công việc của họ. Chủ đề chính sẽ thiết lập sự kiện và kích hoạt xử lý trong tất cả các chủ đề
Đầu tiên, chúng ta có thể định nghĩa một hàm tác vụ đích nhận luồng được chia sẻ. Phiên bản sự kiện và một số nguyên duy nhất để xác định luồng
1
2
3
# chức năng nhiệm vụ mục tiêu
def nhiệm vụ[sự kiện, number]:
#
Tiếp theo, hàm sẽ đợi sự kiện được thiết lập trước khi bắt đầu công việc xử lý
1
2
3
.. .
# chờ sự kiện được thiết lập
sự kiện. chờ đã[]
Sau khi được kích hoạt, chuỗi sẽ tạo một số ngẫu nhiên, chặn trong giây lát và báo cáo một tin nhắn
1
2
3
4
5
.. .
# bắt đầu xử lý
giá trị = ngẫu nhiên[]
ngủ[giá trị]
in[f'Chuỗi {số} có {giá trị}']
Liên kết điều này lại với nhau, chức năng nhiệm vụ mục tiêu hoàn chỉnh được liệt kê bên dưới
1
2
3
4
5
6
7
8
# chức năng nhiệm vụ mục tiêu
def nhiệm vụ[sự kiện, number]:
# đợi sự kiện được thiết lập
sự kiện. chờ đã[]
# bắt đầu xử lý
giá trị = ngẫu nhiên[]
ngủ[giá trị]
print[f'Đã có chủ đề {number}]
Chủ đề chính trước tiên sẽ tạo luồng được chia sẻ. Phiên bản sự kiện, sẽ ở trạng thái “không được đặt” theo mặc định
1
2
3
.. .
# tạo một đối tượng sự kiện được chia sẻ
sự kiện = Sự kiện[]
Tiếp theo, chúng ta có thể bắt đầu năm luồng mới chỉ định hàm task[] mục tiêu với đối tượng sự kiện và một số nguyên duy nhất làm đối số
1
2
3
4
5
.. .
# tạo một bộ chủ đề
cho i trong phạm vi[5]:
chuỗi = Chuỗi[target=task, args=[event, i]]
chuỗi. bắt đầu[]
Cuối cùng, luồng chính sẽ chặn trong giây lát, sau đó kích hoạt quá trình xử lý trong tất cả các luồng thông qua đối tượng sự kiện
1
2
3
4
5
6
.. .
# chặn trong giây lát
in['Chặn luồng chính. ']
ngủ[2]
# bắt đầu xử lý trong tất cả các chủ đề
sự kiện. đặt[]
Liên kết tất cả những điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#Trăn Siêu Nhanh. com
# ví dụ về việc sử dụng một đối tượng sự kiện
từ thời gian nhập ngủ
từ ngẫu nhiên nhập ngẫu nhiên
từ luồng nhập Luồng
từ phân luồng nhập Sự kiện
# chức năng nhiệm vụ mục tiêu
def nhiệm vụ[sự kiện, number]:
# đợi sự kiện được thiết lập
sự kiện. chờ đã[]
# bắt đầu xử lý
giá trị = ngẫu nhiên[]
ngủ[giá trị]
print[f'Đã có chủ đề {number}]
# tạo một đối tượng sự kiện được chia sẻ
sự kiện = Sự kiện[]
# tạo một bộ chủ đề
cho i trong phạm vi[5]:
chuỗi = Chuỗi[target=task, args=[event, i]]
chuỗi. bắt đầu[]
# chặn trong giây lát
in['Chặn luồng chính. ']
ngủ[2]
# bắt đầu xử lý trong tất cả các chủ đề
sự kiện. đặt[]
# chờ cho tất cả các chủ đề kết thúc
Chạy ví dụ đầu tiên tạo và bắt đầu năm chủ đề. Mỗi luồng chờ sự kiện trước khi nó bắt đầu xử lý
Các khối luồng chính trong giây lát, cho phép tất cả các luồng bắt đầu và bắt đầu chờ sự kiện. Chủ đề chính sau đó đặt sự kiện. Điều này kích hoạt tất cả năm luồng thực hiện xử lý của chúng và báo cáo một thông báo
Lưu ý, kết quả cụ thể của bạn sẽ khác do sử dụng các số ngẫu nhiên
1
2
3
4
5
6
chặn chủ đề chính
Chủ đề 2 có 0. 12310258010408259
Chủ đề 4 có 0. 2951602689055347
Chủ đề 3 có 0. 2995528547475702
Chủ đề 0 nhận 0. 6661975710559368
Chủ đề 1 được 0. 6687449622581129
Khóa học lập trình Python miễn phí
Tải xuống bảng cheat API luồng của tôi và như một phần thưởng, bạn sẽ có quyền truy cập MIỄN PHÍ vào khóa học email 7 ngày của tôi
Khám phá cách sử dụng mô-đun phân luồng Python, bao gồm cách tạo và bắt đầu các luồng mới cũng như cách sử dụng khóa và ngữ nghĩa mutex