Mở rộng

Hướng chính cho việc mở rộng asyncio là viết các lớp event loop tùy chỉnh. Asyncio có những người trợ giúp có thể được sử dụng để đơn giản hóa tác vụ này.

Ghi chú

Các bên thứ ba nên thận trọng khi sử dụng lại mã asyncio hiện có, phiên bản Python mới có thể phá vỡ khả năng tương thích ngược trong phần internal của API.

Viết vòng lặp sự kiện tùy chỉnh

asyncio.AbstractEventLoop khai báo rất nhiều phương thức. Thực hiện tất cả chúng từ đầu là một công việc tẻ nhạt.

Một vòng lặp có thể triển khai miễn phí nhiều phương thức phổ biến bằng cách kế thừa từ asyncio.BaseEventLoop.

Đổi lại, người kế nhiệm nên triển khai một loạt phương thức private được khai báo nhưng không được triển khai trong asyncio.BaseEventLoop.

Ví dụ: loop.create_connection() kiểm tra các đối số, phân giải các địa chỉ DNS và gọi loop._make_socket_transport() mà lớp kế thừa sẽ triển khai. Phương thức _make_socket_transport() không được ghi lại và được coi là internal API.

Các nhà xây dựng riêng trong tương lai và nhiệm vụ

asyncio.Futureasyncio.Task không bao giờ được tạo trực tiếp, thay vào đó hãy sử dụng các nhà máy loop.create_future()loop.create_task() hoặc asyncio.create_task() tương ứng.

Tuy nhiên, event loops của bên thứ ba có thể triển khai tác vụ và tương lai tích hợp sẵn reuse nhằm mục đích nhận được mã phức tạp và được tối ưu hóa cao miễn phí.

Với mục đích này, các hàm tạo private sau đây được liệt kê:

Future.__init__(*, loop=None)

Tạo một phiên bản tương lai tích hợp sẵn.

loop là một phiên bản vòng lặp sự kiện tùy chọn.

Task.__init__(coro, *, loop=None, name=None, context=None)

Tạo một phiên bản tác vụ tích hợp.

loop là một phiên bản vòng lặp sự kiện tùy chọn. Các đối số còn lại được mô tả trong mô tả loop.create_task().

Thay đổi trong phiên bản 3.11: đối số context được thêm vào.

Hỗ trợ trọn đời nhiệm vụ

Việc triển khai tác vụ của bên thứ ba nên gọi các hàm sau để giữ cho tác vụ được hiển thị bởi asyncio.all_tasks()asyncio.current_task():

asyncio._register_task(task)

Đăng ký một task mới do asyncio quản lý.

Gọi hàm từ một hàm tạo tác vụ.

asyncio._unregister_task(task)

Hủy đăng ký task khỏi cấu trúc bên trong asyncio.

Hàm nên được gọi khi một tác vụ sắp hoàn thành.

asyncio._enter_task(loop, task)

Chuyển tác vụ hiện tại sang đối số task.

Gọi hàm ngay trước khi thực thi một phần coroutine được nhúng (coroutine.send() hoặc coroutine.throw()).

asyncio._leave_task(loop, task)

Chuyển tác vụ hiện tại từ task sang None.

Gọi hàm ngay sau khi thực hiện coroutine.send() hoặc coroutine.throw().