Có thể đợi các điều kiện khác nhau, chẳng hạn như tất cả các nhiệm vụ phải hoàn thành, nhiệm vụ đầu tiên phải hoàn thành và nhiệm vụ đầu tiên không thành công với một ngoại lệ
Trong hướng dẫn này, bạn sẽ khám phá cách đợi các tác vụ asyncio hoàn thành trong Python
Bắt đầu nào
Mục lục
không đồng bộ là gì. Chờ đã[]
Có thể được sử dụng để chờ một tập hợp các tác vụ asyncio hoàn thành
Nhớ lại rằng một tác vụ asyncio là một thể hiện của asyncio. Lớp nhiệm vụ bao bọc một coroutine. Nó cho phép một coroutine được lên lịch và thực thi một cách độc lập, và đối tượng Tác vụ cung cấp khả năng xử lý tác vụ để truy vấn trạng thái và nhận kết quả
Bạn có thể tìm hiểu thêm về các tác vụ asyncio trong hướng dẫn
- Tác vụ Asyncio là gì
Hàm wait[] cho phép chúng ta đợi một tập hợp các tác vụ được thực hiện
Cuộc gọi chờ có thể được cấu hình để chờ các điều kiện khác nhau, chẳng hạn như tất cả các tác vụ đang được hoàn thành, tác vụ đầu tiên đã hoàn thành và tác vụ đầu tiên không thành công với một lỗi
Tiếp theo, hãy xem cách chúng ta có thể sử dụng hàm wait[]
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 asyncio. Chờ đã[]
sự không đồng bộ. hàm wait[] lấy một tập hợp các đối tượng đang chờ, điển hình là các đối tượng Tác vụ
Đây có thể là một danh sách, lệnh hoặc tập hợp các đối tượng tác vụ mà chúng tôi đã tạo, chẳng hạn như thông qua các cuộc gọi đến asyncio. hàm tác vụ create[] trong phần hiểu danh sách
Ví dụ
1
2
3
.. .
# tạo nhiều nhiệm vụ
tác vụ = [asyncio. create_task[task_coro[i]] for i in range[10]]
sự không đồng bộ. wait[] sẽ không trả về cho đến khi đáp ứng một số điều kiện về tập hợp các tác vụ
Theo mặc định, điều kiện là tất cả các nhiệm vụ đã được hoàn thành
Hàm wait[] trả về một bộ gồm hai bộ. Bộ đầu tiên chứa tất cả các đối tượng tác vụ đáp ứng điều kiện và bộ thứ hai chứa tất cả các đối tượng tác vụ khác chưa đáp ứng điều kiện
Các tập hợp này được gọi là tập hợp “đã hoàn thành” và tập hợp “đang chờ xử lý”
Ví dụ
1
2
3
.. .
# đợi tất cả các nhiệm vụ hoàn thành
xong, đang chờ xử lý = đang chờ asyncio.chờ đã[nhiệm vụ]
Về mặt kỹ thuật, asyncio. wait[] là một hàm coroutine trả về một coroutine
Sau đó, chúng ta có thể đợi coroutine này sẽ trả về bộ dữ liệu
Ví dụ
1
2
3
4
5
.. .
# tạo quy trình chờ đợi
wait_coro = asyncio. chờ đã[nhiệm vụ]
# chờ đợi coroutine chờ đợi
tuple = await wait_coro
Điều kiện chờ đợi có thể được chỉ định bởi đối số “return_when” được đặt thành asyncio. ALL_COMPLETED theo mặc định
Ví dụ
1
2
3
.. .
# đợi tất cả các nhiệm vụ hoàn thành
xong, đang chờ xử lý = đang chờ asyncio.chờ đã[nhiệm vụ, return_when . =asyncio.ALL_COMPLETED]
Chúng ta có thể đợi nhiệm vụ đầu tiên được hoàn thành bằng cách đặt return_when thành FIRST_COMPLETED
Ví dụ
1
2
3
.. .
# đợi nhiệm vụ đầu tiên được hoàn thành
xong, đang chờ xử lý = đang chờ asyncio.chờ đã[nhiệm vụ, return_when . =asyncio.FIRST_COMPLETED]
Khi task đầu tiên hoàn thành và trả về done set, các task còn lại không bị hủy và tiếp tục thực hiện đồng thời
Chúng tôi có thể đợi tác vụ đầu tiên thất bại với một ngoại lệ bằng cách đặt return_when thành FIRST_EXCEPTION
Ví dụ
1
2
3
.. .
# đợi tác vụ đầu tiên thất bại
xong, đang chờ xử lý = đang chờ asyncio.chờ đã[nhiệm vụ, return_when . =asyncio.FIRST_EXCEPTION]
Trong trường hợp này, tập đã hoàn thành sẽ chứa tác vụ đầu tiên không thành công với một ngoại lệ. Nếu không có tác vụ nào thất bại với một ngoại lệ, bộ hoàn thành sẽ chứa tất cả các tác vụ và hàm wait[] sẽ chỉ trả về sau khi tất cả các tác vụ được hoàn thành
Chúng tôi có thể chỉ định khoảng thời gian chúng tôi sẵn sàng đợi cho điều kiện nhất định thông qua đối số “hết thời gian chờ” tính bằng giây
Nếu hết thời gian chờ trước khi điều kiện được đáp ứng, bộ nhiệm vụ được trả về với bất kỳ tập con nhiệm vụ nào đáp ứng điều kiện tại thời điểm đó, e. g. tập hợp con của các nhiệm vụ được hoàn thành nếu đợi tất cả các nhiệm vụ hoàn thành
Ví dụ
1
2
3
.. .
# đợi tất cả các tác vụ hoàn thành với thời gian chờ
xong, đang chờ xử lý = đang chờ asyncio.chờ đã[nhiệm vụ, hết thời gian=3]
Nếu hết thời gian chờ trước khi điều kiện được đáp ứng, một ngoại lệ sẽ không được đưa ra và các tác vụ còn lại sẽ không bị hủy
Bây giờ chúng ta đã biết cách sử dụng asyncio. hàm wait[], hãy xem một số ví dụ đã hoạt động
Bị nhầm lẫn bởi API mô-đun asyncio?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi
Ví dụ về Chờ tất cả các tác vụ
Chúng ta có thể khám phá cách đợi tất cả các tác vụ bằng cách sử dụng asyncio. Chờ đã[]
Trong ví dụ này, chúng tôi sẽ định nghĩa một coroutine nhiệm vụ đơn giản tạo ra một giá trị ngẫu nhiên, ngủ trong một phần giây, sau đó báo cáo một thông báo với giá trị được tạo
Sau đó, coroutine chính sẽ tạo nhiều tác vụ trong danh sách hiểu với coroutine và sau đó đợi tất cả các tác vụ hoàn thành
Ví dụ đầy đủ được liệt kê dưới đây
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
#Trăn Siêu Nhanh. com
# ví dụ về việc đợi tất cả các nhiệm vụ hoàn thành
từ ngẫu nhiên nhập ngẫu nhiên
nhập asyncio
# coroutine để thực thi trong một nhiệm vụ mới
async def task_coro[arg]:
# tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1
giá trị = ngẫu nhiên[]
# khối trong giây lát
chờ asyncio. ngủ[giá trị]
# báo cáo giá trị
in[f'>nhiệm vụ {arg}]
# quy trình chính
không đồng bộ def chính[]:
# tạo nhiều tác vụ
nhiệm vụ = [asyncio.create_task[task_coro[i]] for i in range[10]]
# đợi tất cả tác vụ hoàn tất
xong,đang chờ xử lý = await asyncio.chờ đã[nhiệm vụ]
# báo cáo kết quả
in['Tất cả đã xong'] nhiệm vụ 5 được thực hiện với 0. 0591009105682192
> nhiệm vụ 8 được thực hiện với 0. 10453715687017351
> nhiệm vụ 0 được thực hiện với 0. 15462838864295925
> nhiệm vụ 6 được thực hiện với 0. 4103492027393125
> nhiệm vụ 9 được thực hiện với 0. 45567100006991623
> nhiệm vụ 2 được thực hiện với 0. 6984682905809402
> nhiệm vụ 7 được thực hiện với 0. 7785363531316224
> nhiệm vụ 3 được thực hiện với 0. 827386088873161
> nhiệm vụ 4 được thực hiện với 0. 9481344994700972
> nhiệm vụ 1 được thực hiện với 0. 9577302665040541
Tất cả đã được làm xong
Tiếp theo, hãy xem cách chúng ta có thể đợi nhiệm vụ đầu tiên hoàn thành
Khóa học Python Asyncio miễn phí
Tải xuống bảng gian lận API asyncio của tôi và như một phần thưởng, bạn sẽ nhận được quyền truy cập MIỄN PHÍ vào khóa học email 7 ngày của tôi trên asyncio
Khám phá cách sử dụng mô-đun asyncio của Python, bao gồm cách xác định, tạo và chạy các coroutine mới cũng như cách sử dụng non-blocking I/O
Tìm hiểu thêm
Ví dụ về chờ nhiệm vụ đầu tiên
Chúng ta có thể khám phá cách đợi tác vụ đầu tiên hoàn thành bằng cách sử dụng asyncio. Chờ đã[]
Trong ví dụ này, chúng tôi sẽ sử dụng lại cùng một coroutine nhiệm vụ đơn giản tạo ra một giá trị ngẫu nhiên, ngủ trong một phần giây, sau đó báo cáo một thông báo với giá trị được tạo
Sau đó, quy trình đăng ký chính sẽ tạo nhiều tác vụ trong danh sách hiểu với quy trình đăng ký như trước. Sau đó, nó sẽ đợi nhiệm vụ đầu tiên hoàn thành
Sau khi hoàn thành một nhiệm vụ, nhiệm vụ đó được truy xuất từ tập hợp các nhiệm vụ đã hoàn thành và thông tin chi tiết về nhiệm vụ đó được báo cáo
Ví dụ đầy đủ được liệt kê dưới đây
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ề chờ nhiệm vụ đầu tiên hoàn thành
từ ngẫu nhiên nhập ngẫu nhiên
nhập asyncio
# coroutine để thực thi trong một nhiệm vụ mới
async def task_coro[arg]:
# tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1
giá trị = ngẫu nhiên[]
# khối trong giây lát
chờ asyncio. ngủ[giá trị]
# báo cáo giá trị
in[f'>nhiệm vụ {arg}]
# quy trình chính
không đồng bộ def chính[]:
# tạo nhiều tác vụ
nhiệm vụ = [asyncio.create_task[task_coro[i]] for i in range[10]]
# đợi tác vụ đầu tiên hoàn thành
xong,đang chờ xử lý = await asyncio.chờ đã[nhiệm vụ, return_when . =asyncio.FIRST_COMPLETED]
# kết quả báo cáo
in['Xong']
# hoàn thành nhiệm vụ đầu tiên
đầu tiên = xong. bật[]
in[đầu tiên]
# bắt đầu chương trình asyncio
không đồng bộ. chạy[chính[]]
Chạy ví dụ trước tiên sẽ tạo main[] coroutine và sử dụng nó làm điểm vào chương trình asyncio
Sau đó, main[] coroutine tạo một danh sách mười tác vụ trong phần hiểu danh sách, mỗi tác vụ cung cấp một đối số số nguyên duy nhất từ 0 đến 9
Sau đó, main[] coroutine bị treo và đợi tác vụ đầu tiên hoàn thành
Các nhiệm vụ thực hiện. Mỗi cái tạo ra một giá trị ngẫu nhiên, ngủ một lúc, sau đó báo cáo giá trị được tạo của nó
Ngay khi tác vụ đầu tiên hoàn thành, hàm wait[] trả về và quy trình main[] tiếp tục
Tập hợp “xong” chứa một tác vụ duy nhất đã hoàn thành, trong khi tập hợp “đang chờ xử lý” chứa tất cả các tác vụ khác đã được cung cấp trong tập hợp cho hàm wait[]
Sau đó, một nhiệm vụ đã hoàn thành được truy xuất từ tập hợp “đã hoàn thành” và được báo cáo. Trạng thái được in của tác vụ xác nhận rằng thực sự nó đã được thực hiện
Các tác vụ khác không bị hủy và tiếp tục chạy đồng thời. Quá trình thực hiện của chúng bị cắt ngắn do chương trình asyncio bị chấm dứt
Ví dụ này nêu bật cách chúng ta có thể sử dụng hàm wait[] để đợi tác vụ đầu tiên hoàn thành
Lưu ý rằng kết quả sẽ khác nhau mỗi khi chương trình được chạy do sử dụng các số ngẫu nhiên
1
2
3
> nhiệm vụ 9 được thực hiện với 0. 04034360933451242
Xong
Tiếp theo, hãy xem cách chúng ta có thể đợi tác vụ đầu tiên thất bại với một ngoại lệ
Bị choáng ngợp bởi các API đồng thời python?
Tìm sự giải thoát, tải xuống Bản đồ tư duy đồng thời Python MIỄN PHÍ của tôi
Ví dụ về chờ đợi thất bại đầu tiên
Chúng ta có thể khám phá cách đợi tác vụ đầu tiên thất bại bằng cách sử dụng asyncio. Chờ đã[]
Trong ví dụ này, chúng tôi sẽ sử dụng lại cùng một coroutine nhiệm vụ đơn giản tạo ra một giá trị ngẫu nhiên, ngủ trong một phần giây, sau đó báo cáo một thông báo với giá trị được tạo
Nhiệm vụ coroutine được cập nhật để có điều kiện nó sẽ thất bại với một ngoại lệ nếu giá trị được tạo dưới ngưỡng
Coroutine chính sau đó sẽ tạo ra nhiều tác vụ. Sau đó, nó sẽ đợi tác vụ đầu tiên thất bại với một ngoại lệ
Khi một tác vụ không thành công, nó sẽ được truy xuất từ tập hợp các tác vụ đã hoàn thành và thông tin chi tiết của nó được báo cáo
Ví dụ đầy đủ được liệt kê dưới đây
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
29
30
31
#Trăn Siêu Nhanh. com
# ví dụ về việc đợi tác vụ đầu tiên thất bại
từ ngẫu nhiên nhập ngẫu nhiên
nhập asyncio
# coroutine để thực thi trong một nhiệm vụ mới
async def task_coro[arg]:
# tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1
giá trị = ngẫu nhiên[]
# khối trong giây lát
chờ asyncio. ngủ[giá trị]
# báo cáo giá trị
in[f'>nhiệm vụ {arg}]
# thất bại có điều kiện
giá trị nếu value nhiệm vụ 5 được thực hiện với 0. 13168449673381888
Xong
Tiếp theo, hãy xem cách chúng ta có thể đợi các tác vụ có thời gian chờ
Ví dụ về Chờ đợi với Thời gian chờ
Chúng ta có thể khám phá cách đợi tất cả các tác vụ hoàn thành khi hết thời gian chờ bằng cách sử dụng asyncio. Chờ đã[]
Trong ví dụ này, chúng tôi sẽ sử dụng lại cùng một coroutine nhiệm vụ đơn giản tạo ra một giá trị ngẫu nhiên, ngủ trong một phần giây, sau đó báo cáo một thông báo với giá trị được tạo
Sau đó, coroutine chính sẽ tạo nhiều tác vụ và đợi tất cả các tác vụ hoàn thành. Trong trường hợp này, thời gian chờ được chỉ định, đặt giới hạn trên cho thời gian người gọi sẵn sàng đợi
Khi tất cả các nhiệm vụ đã hoàn thành hoặc hết thời gian chờ, các nhóm nhiệm vụ đã hoàn thành và đang chờ xử lý sẽ được trả về. Tổng số nhiệm vụ đã hoàn thành trong thời gian chờ sau đó được báo cáo
Ví dụ đầy đủ được liệt kê dưới đây
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
#Trăn Siêu Nhanh. com
# ví dụ về việc đợi tất cả các tác vụ được hoàn thành với thời gian chờ
từ ngẫu nhiên nhập ngẫu nhiên
nhập asyncio
# coroutine để thực thi trong một nhiệm vụ mới
async def task_coro[arg]:
# tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 10
giá trị = ngẫu nhiên[] * 10
# khối trong giây lát
chờ asyncio. ngủ[giá trị]
# báo cáo giá trị
in[f'>nhiệm vụ {arg}]
# quy trình chính
không đồng bộ def chính[]:
# tạo nhiều tác vụ
nhiệm vụ = [asyncio.create_task[task_coro[i]] for i in range[10]]
# đợi tất cả tác vụ hoàn tất
xong,đang chờ xử lý = await asyncio.chờ đã[nhiệm vụ, hết thời gian=5]
# báo cáo kết quả
in[f'Xong, {len[]
# bắt đầu chương trình asyncio
không đồng bộ. chạy[chính[]]
Chạy ví dụ trước tiên sẽ tạo main[] coroutine và sử dụng nó làm điểm vào chương trình asyncio
Sau đó, main[] coroutine tạo một danh sách mười tác vụ trong phần hiểu danh sách, mỗi tác vụ cung cấp một đối số số nguyên duy nhất từ 0 đến 9
Sau đó main[] coroutine bị treo và đợi tất cả các tác vụ hoàn thành
Nó chỉ định thời gian chờ là 5 giây. Đây là khoảng một nửa thời lượng của các nhiệm vụ dài nhất có thể được tạo
Các nhiệm vụ thực hiện. Mỗi cái tạo ra một giá trị ngẫu nhiên trong khoảng từ 0 đến 10, ngủ trong số giây được tạo, sau đó báo cáo giá trị được tạo của nó
Hết thời gian chờ và main[] coroutine tiếp tục. Nó báo cáo một thông báo cho biết số lượng tác vụ đã được hoàn thành trong thời gian chờ, trong trường hợp này là 6 tác vụ
Ví dụ này nêu bật cách chúng ta có thể sử dụng hàm wait[] để đợi một tập hợp các tác vụ được hoàn thành với thời gian chờ
Lưu ý rằng kết quả sẽ khác nhau mỗi khi chương trình được chạy do sử dụng các số ngẫu nhiên
1
2
3
4
5
6
7
> nhiệm vụ 7 được thực hiện với 0. 16485206249285955
> nhiệm vụ 0 được thực hiện với 0. 73241529734688
> nhiệm vụ 4 được thực hiện với 1. 1137310743743878
> nhiệm vụ 6 được thực hiện với 2. 396915437441108
> nhiệm vụ 5 đã hoàn thành với 3. 375537014759735
> nhiệm vụ 2 được thực hiện với 4. 821848023696365
Hoàn thành, 6 nhiệm vụ hoàn thành kịp thời
Ví dụ về Chờ Coroutines
Chúng ta có thể khám phá việc chờ coroutine thay vì tác vụ với asyncio. Chờ đã[]
Hàm wait[] được sử dụng để hỗ trợ các coroutine cũng như các tác vụ. Nó đã được cập nhật để chỉ hỗ trợ các tác vụ
Hỗ trợ cho coroutines trong hàm wait[] không được dùng nữa tại thời điểm viết bài và sẽ dẫn đến Cảnh báo khấu hao trong Python 3. 10. Hỗ trợ này sẽ sớm bị xóa, trong Python 3. 11
Ví dụ dưới đây tạo một danh sách các coroutine và sau đó đợi tất cả chúng hoàn thành
Nếu bạn đang sử dụng Python 3. 10 trở xuống, các coroutine được chuyển đổi thành các tác vụ và được lên lịch để thực hiện
Ví dụ đầy đủ được liệt kê dưới đây
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
#Trăn Siêu Nhanh. com
# ví dụ về việc đợi tất cả các coroutine hoàn thành
từ ngẫu nhiên nhập ngẫu nhiên
nhập asyncio
# coroutine để thực thi trong một nhiệm vụ mới
async def task_coro[arg]:
# tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1
giá trị = ngẫu nhiên[]
# khối trong giây lát
chờ asyncio. ngủ[giá trị]
# báo cáo giá trị
in[f'>nhiệm vụ {arg}]
# quy trình chính
không đồng bộ def chính[]:
# tạo nhiều coroutine
tác vụ = [task_coro[i] for i in range[10]]
# đợi tất cả tác vụ hoàn tất
xong,đang chờ xử lý = await asyncio.chờ đã[nhiệm vụ]
# báo cáo kết quả
in['Tất cả đã xong']