Thoát chức năng không đồng bộ Python

Bạn có thể tạo và sử dụng các trình quản lý bối cảnh không đồng bộ trong các chương trình asyncio bằng cách xác định một đối tượng triển khai các phương thức __aenter__() và __aexit__() dưới dạng coroutine

Trong hướng dẫn này, bạn sẽ khám phá cách tạo và sử dụng trình quản lý bối cảnh không đồng bộ trong Python

Bắt đầu nào

Mục lục

Trình quản lý bối cảnh không đồng bộ là gì

Trình quản lý bối cảnh không đồng bộ là một đối tượng Python triển khai các phương thức __aenter__() và __aexit__()

Trước khi chúng tôi đi sâu vào chi tiết về các trình quản lý ngữ cảnh không đồng bộ, hãy xem xét các trình quản lý ngữ cảnh cổ điển

Trình quản lý bối cảnh

Trình quản lý ngữ cảnh là một đối tượng Python triển khai các phương thức __enter__() và __exit__()

Trình quản lý bối cảnh là một đối tượng xác định bối cảnh thời gian chạy sẽ được thiết lập khi thực thi câu lệnh with. Trình quản lý ngữ cảnh xử lý việc nhập và thoát khỏi ngữ cảnh thời gian chạy mong muốn để thực thi khối mã

Phương thức __enter__() xác định những gì xảy ra ở đầu một khối, chẳng hạn như mở hoặc chuẩn bị tài nguyên, như tệp, ổ cắm hoặc nhóm luồng

Phương thức __exit__() xác định điều gì sẽ xảy ra khi thoát khỏi khối, chẳng hạn như đóng tài nguyên đã chuẩn bị

Các ứng dụng điển hình của trình quản lý bối cảnh bao gồm lưu và khôi phục các loại trạng thái toàn cầu khác nhau, khóa và mở khóa tài nguyên, đóng các tệp đã mở, v.v.

Trình quản lý ngữ cảnh được sử dụng thông qua biểu thức “with”

Thông thường, đối tượng quản lý ngữ cảnh được tạo ở đầu biểu thức “with” và phương thức __enter__() được gọi tự động. Phần nội dung sử dụng tài nguyên thông qua đối tượng trình quản lý bối cảnh được đặt tên, sau đó phương thức __aexit__() được gọi tự động khi khối được thoát, thông thường hoặc thông qua một ngoại lệ

Ví dụ

1

2

3

4

5

.. .

# mở trình quản lý bối cảnh

với Trình quản lý bối cảnh() như manager:

#

# đóng cửa tự động

Điều này phản ánh một biểu thức thử cuối cùng

Ví dụ

1

2

3

4

5

6

7

8

.. .

#tạo đối tượng

người quản lý = Trình quản lý ngữ cảnh()

thử.

người quản lý. __enter__()

#

cuối cùng.

người quản lý. __exit__()

Tiếp theo, chúng ta hãy xem các trình quản lý ngữ cảnh không đồng bộ

Trình quản lý bối cảnh không đồng bộ

Trình quản lý ngữ cảnh không đồng bộ đã được giới thiệu trong “PEP 492 – Coroutines với cú pháp không đồng bộ và chờ đợi“

Họ cung cấp trình quản lý bối cảnh có thể bị treo khi vào và thoát

Trình quản lý ngữ cảnh không đồng bộ là trình quản lý ngữ cảnh có thể tạm dừng thực thi trong các phương thức __aenter__ và __aexit__ của nó

Các phương thức __aenter__ và __aexit__ được định nghĩa là coroutines và được chờ đợi bởi người gọi

Điều này đạt được bằng cách sử dụng biểu thức “không đồng bộ với”

Bạn có thể tìm hiểu thêm về biểu thức “async with” trong hướng dẫn

  • Asyncio không đồng bộ với là gì

Như vậy, trình quản lý bối cảnh không đồng bộ chỉ có thể được sử dụng trong các chương trình asyncio, chẳng hạn như trong các cuộc gọi coroutines

Tiếp theo, chúng ta hãy xem xét kỹ hơn sự khác biệt giữa trình quản lý bối cảnh cổ điển và không đồng bộ

Trình quản lý bối cảnh so với Trình quản lý bối cảnh không đồng bộ

Cả trình quản lý bối cảnh cổ điển và trình quản lý bối cảnh không đồng bộ đều có nhiều điểm chung

Cả hai đều cố gắng đạt được hiệu ứng giống nhau của biểu thức lần thử cuối cùng với mã tối thiểu và giao diện được xác định rõ

Trình quản lý bối cảnh cổ điển sử dụng các phương thức __enter__ và __exit__, trong khi trình quản lý bối cảnh không đồng bộ sử dụng các phương thức __aenter__ và __aexit__

  • Trình quản lý bối cảnh cổ điển. Triển khai các phương thức __enter__() và __exit__()
  • Trình quản lý bối cảnh không đồng bộ. Triển khai các phương thức __aenter__() và __aexit__()

Trình quản lý bối cảnh cổ điển có thể được sử dụng chung ở mọi nơi trong chương trình Python, trong khi trình quản lý bối cảnh không đồng bộ chỉ có thể được sử dụng trong các chương trình không đồng bộ, chẳng hạn như trong coroutines

  • Trình quản lý bối cảnh cổ điển. Được sử dụng ở mọi nơi trong chương trình python
  • Trình quản lý bối cảnh không đồng bộ. Được sử dụng trong các chương trình asyncio

Trình quản lý ngữ cảnh cổ điển được sử dụng thông qua biểu thức “with”, trong khi trình quản lý ngữ cảnh không đồng bộ được sử dụng thông qua biểu thức “async with”

  • Trình quản lý bối cảnh cổ điển. Được sử dụng thông qua biểu thức “with”
  • Trình quản lý bối cảnh không đồng bộ. Được sử dụng thông qua biểu thức “không đồng bộ với”

Bây giờ chúng ta đã biết về trình quản lý bối cảnh không đồng bộ, hãy xem cách chúng ta có thể sử dụng chúng

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 Trình quản lý bối cảnh không đồng bộ

Trong phần này, chúng ta sẽ khám phá cách chúng ta có thể xác định, tạo và sử dụng trình quản lý bối cảnh không đồng bộ trong các chương trình asyncio của mình

Xác định Trình quản lý bối cảnh không đồng bộ

Chúng ta có thể định nghĩa một trình quản lý bối cảnh không đồng bộ là một đối tượng Python thực hiện các phương thức __aenter__() và __aexit__()

Điều quan trọng là cả hai phương thức phải được xác định là coroutines bằng cách sử dụng “def async” và do đó phải trả về các giá trị đang chờ

Ví dụ

1

2

3

4

5

6

7

8

9

10

11

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

Bởi vì mỗi phương thức đều là coroutine, nên bản thân chúng có thể đang đợi coroutine hoặc tác vụ

Ví dụ

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

Sử dụng Trình quản lý ngữ cảnh không đồng bộ

Trình quản lý ngữ cảnh không đồng bộ được sử dụng thông qua biểu thức “không đồng bộ với”

Điều này sẽ tự động chờ các coroutine nhập và thoát, tạm dừng coroutine đang gọi khi cần

Ví dụ

1

2

3

4

.. .

# sử dụng trình quản lý bối cảnh không đồng bộ

không đồng bộ với AsyncContextManager() as manager:

#

Như vậy, biểu thức “async with” và trình quản lý bối cảnh không đồng bộ nói chung chỉ có thể được sử dụng trong các chương trình asyncio, chẳng hạn như trong coroutines

Bạn có thể tìm hiểu thêm về biểu thức “async with” trong hướng dẫn

  • Asyncio không đồng bộ với là gì

Bây giờ chúng ta đã biết cách sử dụng trình quản lý ngữ cảnh không đồng bộ, hãy xem một số ví dụ đã hoạt động

Bối rối với API mô-đun asyncio?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Ví dụ về cách sử dụng Trình quản lý ngữ cảnh không đồng bộ theo cách thủ công

Chúng ta có thể khám phá cách sử dụng trình quản lý bối cảnh không đồng bộ theo cách thủ công

Trong ví dụ này, chúng tôi sẽ xác định trình quản lý ngữ cảnh không đồng bộ. Phương pháp vào và ra của người quản lý sẽ báo cáo một tin nhắn và ngủ trong giây lát. Các thông báo sẽ giúp chúng tôi biết khi nào các phương thức được thực thi liên quan đến mã chương trình của chúng tôi và sau đó ngủ để mô phỏng I/O bị chặn và cho thấy rằng các coroutine này có thể bị treo khi gọi các coroutine khác

Trình quản lý bối cảnh không đồng bộ sẽ được sử dụng thủ công

Nghĩa là, chúng ta sẽ gọi các phương thức nhập và thoát một cách rõ ràng, truy xuất các tệp có thể chờ từ các coroutines và chờ chúng trực tiếp

Đây là một ví dụ tốt để cho thấy chính xác điều gì đang tự động xảy ra khi chúng ta sử dụng các kiểu sử dụng phổ biến hơn, chẳng hạn như biểu thức “không đồng bộ với”

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

32

33

34

35

36

37

#Trăn Siêu Nhanh. com

# ví dụ về cách sử dụng trình quản lý bối cảnh không đồng bộ theo cách thủ công

nhập asyncio

 

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

# định nghĩa một coroutine đơn giản

async def custom_coroutine():

   # tạo và sử dụng trình quản lý ngữ cảnh không đồng bộ

    người quản lý = AsyncContextManager()

    # được chờ để vào trình quản lý

    enter_awaitable = người quản lý. __aenter__()

    # đang chờ mục nhập

    chờ nhập_ chờ

    # thực thi phần thân

    in(f'trong trình quản lý'<)

    # có thể đợi để thoát khỏi trình quản lý

    exit_awaitable = người quản lý. __aexit__(Không có, Không có, None)

    # đang chờ thoát

    chờ thoát_ chờ

 

# bắt đầu chương trình asyncio

không đồng bộ. chạy(custom_coroutine())

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

main() coroutine chạy và tạo một thể hiện của lớp AsyncContextManager của chúng ta

Tiếp theo, chúng ta gọi __aenter__() coroutine để lấy một đối tượng coroutine đang chờ

Điều đáng chờ đợi sau đó được chờ đợi, tạm dừng quy trình chính () và thực thi quy trình nhập quy trình báo cáo một tin nhắn và ngủ trong giây lát

main() coroutine tiếp tục và báo cáo một tin nhắn

Sau đó, nó gọi __aexit__() coroutine để lấy một đối tượng coroutine đang chờ

Điều đáng chờ đợi thứ hai này được chờ đợi, tạm dừng quy trình chính(), thực thi quy trình đăng ký sau đó báo cáo một tin nhắn và ngủ trong giây lát

main() coroutine tiếp tục và kết thúc chương trình

Ví dụ phi thực tế này làm nổi bật những gì đang tự động xảy ra ở hậu trường khi chúng ta sử dụng trình quản lý ngữ cảnh có biểu thức “không đồng bộ với”, chẳng hạn như trong phần tiếp theo

1

2

3

> vào trình quản lý ngữ cảnh

trong người quản lý

> thoát khỏi trình quản lý ngữ cảnh

Tiếp theo, chúng ta sẽ xem cách sử dụng trình quản lý ngữ cảnh thông qua biểu thức “async with”


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ề Trình quản lý ngữ cảnh không đồng bộ và “không đồng bộ với”

Chúng ta có thể khám phá cách sử dụng trình quản lý bối cảnh không đồng bộ thông qua biểu thức “async with”

Trong ví dụ này, chúng tôi sẽ cập nhật ví dụ trên để sử dụng trình quản lý bối cảnh theo cách bình thường

Chúng tôi sẽ sử dụng biểu thức “không đồng bộ với” và trên một dòng, tạo và nhập trình quản lý ngữ cảnh. Điều này sẽ tự động chờ phương thức nhập

Sau đó, chúng tôi có thể sử dụng trình quản lý trong khối bên trong. Trong trường hợp này, chúng tôi sẽ chỉ báo cáo một tin nhắn

Thoát khỏi khối bên trong sẽ tự động chờ phương thức thoát của trình quản lý bối cảnh

Đối chiếu ví dụ này với ví dụ trước cho thấy mức độ nặng nề của biểu thức “async with” đối với chúng ta trong một chương trình asyncio

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

#Trăn Siêu Nhanh. com

# ví dụ về trình quản lý bối cảnh không đồng bộ thông qua async với

nhập asyncio

 

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

# định nghĩa một coroutine đơn giản

async def custom_coroutine():

   # tạo và sử dụng trình quản lý ngữ cảnh không đồng bộ

    không đồng bộ với AsyncContextManager() as manager:

        # báo cáo kết quả

        in(f'trong trình quản lý'<)

 

# bắt đầu chương trình asyncio

không đồng bộ. chạy(custom_coroutine())

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

main() coroutine chạy và tạo một thể hiện của lớp AsyncContextManager của chúng ta trong một biểu thức “async with”

Biểu thức này tự động gọi phương thức enter và đợi coroutine. Một tin nhắn được báo cáo và quy trình đăng ký chặn trong giây lát

main() coroutine tiếp tục và thực thi phần thân của trình quản lý bối cảnh, in một thông báo

Khối được thoát và phương thức thoát của trình quản lý bối cảnh được chờ tự động, báo cáo một tin nhắn và ngủ một lúc

Điều này làm nổi bật kiểu sử dụng bình thường cho trình quản lý ngữ cảnh không đồng bộ trong chương trình asyncio

1

2

3

> vào trình quản lý ngữ cảnh

trong người quản lý

> thoát khỏi trình quản lý ngữ cảnh

Tiếp theo, chúng ta có thể xem điều gì sẽ xảy ra với trình quản lý bối cảnh không đồng bộ khi một ngoại lệ được đưa ra

Choáng ngợp trước các API đồng thời của python?
Để tìm sự giải thoát, hãy tải xuống Bản đồ tư duy về đồng thời Python MIỄN PHÍ của tôi

Ví dụ về Trình quản lý bối cảnh không đồng bộ có ngoại lệ

Chúng ta có thể khám phá điều gì xảy ra với trình quản lý bối cảnh không đồng bộ khi một ngoại lệ được đưa ra trong khối bên trong

Trong ví dụ này, chúng tôi sẽ cập nhật ví dụ trên sử dụng trình quản lý ngữ cảnh không đồng bộ thông qua biểu thức “không đồng bộ với” và đưa ra một ngoại lệ trong khối bên trong

Mục tiêu của ví dụ này là để chỉ ra rằng bất kể khối bên trong của trình quản lý bối cảnh được thoát ra như thế nào, thì biểu thức “không đồng bộ với” sẽ đảm bảo rằng quy trình đăng ký thoát được chờ đợi và được thực thi

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ề trình quản lý ngữ cảnh không đồng bộ thoát với một ngoại lệ

nhập asyncio

 

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

# định nghĩa một coroutine đơn giản

async def custom_coroutine():

   # tạo và sử dụng trình quản lý ngữ cảnh không đồng bộ

    không đồng bộ với AsyncContextManager() as manager:

        # báo cáo kết quả

        in(f'trong trình quản lý'<)

        # thất bại với ngoại lệ

        tăng Ngoại lệ('Đã xảy ra sự cố'<)

 

# bắt đầu chương trình asyncio

không đồng bộ. chạy(custom_coroutine())

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

main() coroutine chạy và tạo một thể hiện của lớp AsyncContextManager của chúng ta trong một biểu thức “async with”

Biểu thức này tự động gọi phương thức enter và đợi coroutine. Một tin nhắn được báo cáo và quy trình đăng ký chặn trong giây lát

main() coroutine tiếp tục và thực thi phần thân của trình quản lý bối cảnh, in một thông báo và đưa ra một ngoại lệ

Ngoại lệ được nêu ra khiến khối trình quản lý bối cảnh bị thoát. Phương thức thoát của trình quản lý bối cảnh được chờ đợi tự động, báo cáo một tin nhắn và ngủ trong giây lát

Sau đó, ngoại lệ chấm dứt vòng lặp sự kiện của chương trình asyncio

Điều này nhấn mạnh rằng quy trình thoát của trình quản lý ngữ cảnh không đồng bộ được chờ đợi, bất kể khối bên trong của trình quản lý ngữ cảnh được thoát như thế nào, chẳng hạn như với một ngoại lệ chưa được xử lý

1

2

3

4

5

6

> vào trình quản lý ngữ cảnh

trong người quản lý

> thoát khỏi trình quản lý ngữ cảnh

Traceback (cuộc gọi gần đây nhất cuối cùng)

  

Ngoại lệ. Điều xấu đã xảy ra

Tiếp theo, chúng ta có thể xem xét các lỗi phổ biến khi sử dụng trình quản lý ngữ cảnh không đồng bộ

Các lỗi thường gặp với Trình quản lý bối cảnh không đồng bộ

Thường gặp khó khăn khi bắt đầu với các trình quản lý ngữ cảnh không đồng bộ

Trong phần này, chúng ta sẽ tìm hiểu một số lỗi thường gặp khi sử dụng trình quản lý bối cảnh không đồng bộ và cách khắc phục chúng

Bạn có lỗi nào không được liệt kê bên dưới không?
Hãy cho tôi biết trong phần nhận xét bên dưới và tôi sẽ cố gắng hết sức để trợ giúp.

Ví dụ về Trình quản lý ngữ cảnh không đồng bộ và Biểu thức “với”

Chúng ta có thể khám phá điều gì sẽ xảy ra nếu cố gắng sử dụng trình quản lý bối cảnh không đồng bộ thông qua biểu thức “with”

Trong ví dụ này, chúng tôi cập nhật ví dụ trên để sử dụng trình quản lý bối cảnh không đồng bộ một cách bình thường, ngoại trừ biểu thức “with” bị sai, thay vì biểu thức “async with”

Điều này dự kiến ​​sẽ dẫn đến lỗi vì AsyncContextManager của chúng tôi không triển khai giao diện trình quản lý ngữ cảnh, ví dụ:. g. phương thức __enter__() và sẽ đưa ra một ngoại lệ

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

#Trăn Siêu Nhanh. com

# ví dụ về trình quản lý bối cảnh không đồng bộ thông qua with (kết quả là lỗi)

nhập asyncio

 

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    không đồng bộ def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

        # chặn trong giây lát

        chờ không đồng bộ. ngủ(0. 5)

 

# định nghĩa một coroutine đơn giản

async def custom_coroutine():

   # tạo và sử dụng trình quản lý ngữ cảnh không đồng bộ

    với AsyncContextManager() as manager:

        # báo cáo kết quả

        in(f'trong trình quản lý'<)

 

# bắt đầu chương trình asyncio

không đồng bộ. chạy(custom_coroutine())

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

main() coroutine chạy và tạo một thể hiện của lớp AsyncContextManager của chúng ta trong biểu thức “with”

Điều này không thành công vì biểu thức “với” dự kiến ​​sẽ thực thi phương thức __enter__() trên đối tượng, trong trường hợp này không tồn tại. Thay vào đó, chúng ta có phương thức __aenter__()

Điều này dẫn đến AttributeError chấm dứt chương trình

Ví dụ nêu bật rằng trình quản lý ngữ cảnh không đồng bộ không thể được sử dụng thông qua biểu thức “with” và phải được sử dụng thông qua biểu thức “async with” trong chương trình asyncio

1

2

3

Traceback (cuộc gọi gần đây nhất cuối cùng)

  

Lỗi thuộc tính. __đi vào__

Tiếp theo, chúng ta có thể xem xét việc cố gắng sử dụng trình quản lý bối cảnh không đồng bộ không trả về các giá trị đang chờ

Ví dụ về Trình quản lý bối cảnh không đồng bộ không có Awaitables

Chúng ta có thể khám phá điều gì sẽ xảy ra nếu chúng ta cố gắng sử dụng trình quản lý bối cảnh không đồng bộ được xác định bằng các hàm thay vì coroutine

Trong ví dụ này, chúng ta sẽ sử dụng trình quản lý bối cảnh không đồng bộ một cách bình thường, ngoại trừ việc cập nhật định nghĩa của lớp để các phương thức nhập và thoát là các hàm Python, thay vì các coroutine

Điều này sẽ gây ra lỗi vì biểu thức “không đồng bộ với” sẽ yêu cầu các giá trị có thể chờ đợi được trả về, thay vì giá trị trả về, e. g. một Không có

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ề trình quản lý ngữ cảnh không đồng bộ không có phần chờ (kết quả là lỗi)

nhập asyncio

 

# xác định trình quản lý bối cảnh không đồng bộ

lớp AsyncContextManager.

   # nhập trình quản lý bối cảnh không đồng bộ

    def __aenter__(self):

        # báo cáo thư

        in('>nhập trình quản lý ngữ cảnh')

 

   # thoát khỏi trình quản lý bối cảnh không đồng bộ

    def __aexit__(self, exc_type, exc, tb):

        # báo cáo thư

        in('>thoát khỏi trình quản lý bối cảnh')

 

# định nghĩa một coroutine đơn giản

async def custom_coroutine():

   # tạo và sử dụng trình quản lý ngữ cảnh không đồng bộ

    không đồng bộ với AsyncContextManager() as manager:

        # báo cáo kết quả

        in(f'trong trình quản lý'<)

 

# bắt đầu chương trình asyncio

không đồng bộ. chạy(custom_coroutine())

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

main() coroutine chạy và tạo một thể hiện của lớp AsyncContextManager của chúng ta trong một biểu thức “async with”

Điều này không thành công vì biểu thức “không đồng bộ với” thực thi để nhận một giá trị có thể chờ khi gọi __aenter__() coroutine, trong khi phương thức __aenter__() được triển khai như một hàm bình thường và trả về giá trị Không có

Điều này nhấn mạnh rằng giao diện của trình quản lý bối cảnh không đồng bộ phải được triển khai bằng cách sử dụng các coroutine trả về các giá trị có thể chờ đợi

1

2

3

4

> vào trình quản lý ngữ cảnh

Traceback (cuộc gọi gần đây nhất cuối cùng)

  

LoạiLỗi. 'không đồng bộ với' đã nhận được một đối tượng từ __aenter__ không triển khai __await__. Không có Loại

Chức năng không đồng bộ Python là gì?

Lập trình không đồng bộ trong Python. Lập trình không đồng bộ là một đặc điểm của các ngôn ngữ lập trình hiện đại cho phép ứng dụng thực hiện nhiều thao tác khác nhau mà không cần đợi bất kỳ thao tác nào .

Bạn có thể gọi một hàm async mà không cần chờ Python không?

Quy tắc. không-async-không chờ đợi . Functions marked async must contain an await or return statement.

Run_in_executor là gì?

run_in_executor được dùng để quản lý chuỗi từ bên trong vòng lặp sự kiện . Để làm được điều này, nó cần bọc luồng vào một Tương lai, cần được gán cho một vòng lặp sự kiện (bằng cách này hay cách khác). Lý do phương thức được lưu trữ trực tiếp trong một đối tượng vòng lặp có lẽ là lịch sử. Nó cũng có thể đã được asyncio.

Không đồng bộ cho vòng lặp Python là gì?

Biểu thức async for được dùng để duyệt một trình vòng lặp không đồng bộ . Nó là một câu lệnh vòng lặp for không đồng bộ. Một trình lặp không đồng bộ là một trình vòng lặp mang lại các giá trị có thể chờ đợi. trình lặp không đồng bộ. Một đối tượng triển khai các phương thức __aiter__() và __anext__().