Người chạy bộ

Source code: Lib/asyncio/runners.py

Phần này phác thảo các nguyên hàm asyncio cấp cao để chạy mã asyncio.

Chúng được xây dựng dựa trên event loop với mục đích đơn giản hóa việc sử dụng mã không đồng bộ cho các tình huống phổ biến trên diện rộng.

Chạy chương trình asyncio

asyncio.run(coro, *, debug=None, loop_factory=None)

Thực thi coro trong vòng lặp sự kiện asyncio và trả về kết quả.

Đối số có thể là bất kỳ đối tượng có thể chờ đợi nào.

Hàm này chạy phần có thể chờ đợi, đảm nhiệm việc quản lý vòng lặp sự kiện asyncio, finalizing asynchronous generators và đóng trình thực thi.

Không thể gọi hàm này khi một vòng lặp sự kiện asyncio khác đang chạy trong cùng một luồng.

Nếu debugTrue, vòng lặp sự kiện sẽ chạy ở chế độ gỡ lỗi. False tắt chế độ gỡ lỗi một cách rõ ràng. None được sử dụng để tôn trọng cài đặt Chế độ gỡ lỗi chung.

Nếu loop_factory không phải là None, nó được sử dụng để tạo vòng lặp sự kiện mới; nếu không thì asyncio.new_event_loop() sẽ được sử dụng. Vòng lặp được đóng lại ở cuối. Hàm này nên được sử dụng làm điểm vào chính cho các chương trình asyncio và lý tưởng nhất là chỉ được gọi một lần. Bạn nên sử dụng loop_factory để định cấu hình vòng lặp sự kiện thay vì chính sách. Vượt qua asyncio.EventLoop cho phép chạy asyncio mà không cần hệ thống chính sách.

Người thi hành được cho thời gian chờ là 5 phút để tắt máy. Nếu người thi hành chưa hoàn thành trong khoảng thời gian đó, một cảnh báo sẽ được phát ra và người thi hành sẽ bị đóng.

Ví dụ:

async def main():
    đang chờ asyncio.sleep(1)
    in('xin chào')

asyncio.run(chính())

Added in version 3.7.

Thay đổi trong phiên bản 3.9: Đã cập nhật để sử dụng loop.shutdown_default_executor().

Thay đổi trong phiên bản 3.10: debug theo mặc định là None để tôn trọng cài đặt chế độ gỡ lỗi chung.

Thay đổi trong phiên bản 3.12: Đã thêm tham số loop_factory.

Thay đổi trong phiên bản 3.14: coro có thể là bất kỳ đối tượng đáng chờ đợi nào.

Ghi chú

Hệ thống chính sách asyncio không được dùng nữa và sẽ bị xóa trong Python 3.16; từ đó trở đi, cần có loop_factory rõ ràng để định cấu hình vòng lặp sự kiện.

Trình quản lý bối cảnh của người chạy

class asyncio.Runner(*, debug=None, loop_factory=None)

Trình quản lý bối cảnh giúp đơn giản hóa các lệnh gọi hàm không đồng bộ multiple trong cùng một ngữ cảnh.

Đôi khi, một số hàm không đồng bộ cấp cao nhất sẽ được gọi trong cùng một event loopcontextvars.Context.

Nếu debugTrue, vòng lặp sự kiện sẽ chạy ở chế độ gỡ lỗi. False tắt chế độ gỡ lỗi một cách rõ ràng. None được sử dụng để tôn trọng cài đặt Chế độ gỡ lỗi chung.

loop_factory có thể được sử dụng để ghi đè việc tạo vòng lặp. loop_factory có trách nhiệm đặt vòng lặp đã tạo thành vòng lặp hiện tại. Theo mặc định, asyncio.new_event_loop() được sử dụng và đặt làm vòng lặp sự kiện hiện tại với asyncio.set_event_loop() nếu loop_factoryNone.

Về cơ bản, ví dụ asyncio.run() có thể được viết lại bằng cách sử dụng Á hậu:

async def main():
    đang chờ asyncio.sleep(1)
    in('xin chào')

với asyncio.Runner() làm người chạy:
    Á hậu.run(chính())

Added in version 3.11.

run(coro, *, context=None)

Thực thi coro trong vòng lặp sự kiện được nhúng.

Đối số có thể là bất kỳ đối tượng có thể chờ đợi nào.

Nếu đối số là một coroutine thì đối số đó sẽ được gói trong một Tác vụ.

Đối số context chỉ có từ khóa tùy chọn cho phép chỉ định một contextvars.Context tùy chỉnh để mã chạy vào. Ngữ cảnh mặc định của trình chạy được sử dụng nếu ngữ cảnh là None.

Trả về kết quả có thể chờ đợi hoặc đưa ra một ngoại lệ.

Không thể gọi hàm này khi một vòng lặp sự kiện asyncio khác đang chạy trong cùng một luồng.

Thay đổi trong phiên bản 3.14: coro có thể là bất kỳ đối tượng đáng chờ đợi nào.

close()

Đóng người chạy.

Hoàn thiện các trình tạo không đồng bộ, tắt trình thực thi mặc định, đóng vòng lặp sự kiện và giải phóng contextvars.Context được nhúng.

get_loop()

Trả về vòng lặp sự kiện được liên kết với phiên bản Á hậu.

Ghi chú

Runner sử dụng chiến lược khởi tạo lười biếng, hàm tạo của nó không khởi tạo các cấu trúc cấp thấp cơ bản.

loopcontext được nhúng được tạo khi phần thân with nhập hoặc lệnh gọi đầu tiên của run() hoặc get_loop().

Xử lý gián đoạn bàn phím

Added in version 3.11.

Khi signal.SIGINT được Ctrl-C nâng lên, ngoại lệ KeyboardInterrupt được nâng lên trong luồng chính theo mặc định. Tuy nhiên, điều này không hoạt động với asyncio vì nó có thể làm gián đoạn nội bộ asyncio và có thể khiến chương trình thoát ra.

Để giảm thiểu vấn đề này, asyncio xử lý signal.SIGINT như sau:

  1. asyncio.Runner.run() cài đặt trình xử lý signal.SIGINT tùy chỉnh trước khi bất kỳ mã người dùng nào được thực thi và xóa mã đó khi thoát khỏi hàm.

  2. Zz000zz tạo nhiệm vụ chính cho coroutine được thông qua để thực thi nó.

  3. Khi signal.SIGINT được Ctrl-C nâng lên, trình xử lý tín hiệu tùy chỉnh sẽ hủy tác vụ chính bằng cách gọi asyncio.Task.cancel() để tăng asyncio.CancelledError bên trong tác vụ chính. Điều này khiến ngăn xếp Python bị giãn ra, các khối try/excepttry/finally có thể được sử dụng để dọn dẹp tài nguyên. Sau khi nhiệm vụ chính bị hủy, asyncio.Runner.run() sẽ tăng KeyboardInterrupt.

  4. Người dùng có thể viết một vòng lặp chặt chẽ mà asyncio.Task.cancel() không thể làm gián đoạn, trong trường hợp đó, Ctrl-C thứ hai sau đó ngay lập tức tăng KeyboardInterrupt mà không hủy tác vụ chính.