8.13. Điều khiển vòng lặp

Hầu hết các tập lệnh asyncio không bao giờ chạm trực tiếp vào vòng lặp sự kiện -- asyncio.run() là đủ. Trang này bao gồm bề mặt Loop cho các trường hợp không phải như vậy: cài đặt trình xử lý ngoại lệ, chạy vòng lặp với vòng đời khác với run, hoặc giữ đối tượng vòng lặp để theo dõi.

8.13.1. Lấy vòng lặp

  • asyncio.get_event_loop() -- trả về đối tượng Loop. An toàn khi gọi từ bên trong hoặc bên ngoài coroutine.

  • asyncio.new_event_loop() -- trên MicroPython, đặt lại trạng thái của vòng lặp hiện có thay vì tạo một cái mới. Lưu ý đáng nhắc lại: chỉ có đúng một vòng lặp sự kiện cho mỗi chương trình.

Không có API nào để chạy vòng lặp ngoài các phương thức trên Loopasyncio.run().

8.13.2. Chạy vòng lặp trực tiếp

asyncio.run() là điểm vào đúng đắn cho hầu hết mọi ứng dụng. Hai phương thức Loop tồn tại cho các trường hợp không phải vậy.

  • run_until_complete() -- cho một awaitable, chạy vòng lặp cho đến khi awaitable đó hoàn thành, rồi trả về kết quả của nó. Tương đương với một lời gọi asyncio.run() đơn lẻ, bỏ qua phần dọn dẹp vòng lặp.

  • run_forever() -- chạy vòng lặp cho đến khi stop() được gọi từ bên trong một tác vụ. Không có awaitable cấp cao nhất; ứng dụng dự kiến lập lịch bất cứ thứ gì nó cần qua asyncio.create_task() trước khi gọi run_forever.

Các phương thức đi kèm là stop() (yêu cầu vòng lặp dừng sau khi tác vụ hiện tại hoàn thành) và close() (giải phóng tài nguyên của vòng lặp).

8.13.3. Tạo tác vụ phía vòng lặp

  • create_task() -- cùng thao tác như asyncio.create_task(). Hàm tự do tồn tại để mã ứng dụng không cần tham chiếu vòng lặp cho trường hợp thông thường; phương thức tồn tại cho việc theo dõi đã có tham chiếu đó.

8.13.4. Trình xử lý ngoại lệ

Vòng lặp gọi một trình xử lý khi một tác vụ ném ngoại lệ mà không có gì trong chuỗi gọi coroutine bắt được -- trường hợp điển hình là một tác vụ ứng dụng tạo bằng asyncio.create_task() và không bao giờ await. Trình xử lý mặc định in traceback qua sys.stderr; trang exceptions đã cho thấy cách thay thế bằng một cái tùy chỉnh.

  • set_exception_handler() -- cài đặt trình xử lý tùy chỉnh. Trình xử lý là callable handler(loop, context) trong đó context là dict có ít nhất 'message' và thường có 'exception''future'.

  • get_exception_handler() -- trả về trình xử lý hiện đang được cài đặt, hoặc None nếu đang dùng mặc định.

  • default_exception_handler() -- trình xử lý tích hợp. Hữu ích bên trong trình xử lý tùy chỉnh muốn cũng chạy hành vi mặc định (ghi log vào bộ nhớ flash in traceback chẳng hạn).

  • call_exception_handler() -- chạy trình xử lý hiện đang được cài đặt với một dict ngữ cảnh được xây dựng thủ công. Chủ yếu được sử dụng bởi chính vòng lặp; ứng dụng hiếm khi cần đến.