Chờ đợi () làm gì trong python?

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']

Chủ Đề