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 debug là
True, vòng lặp sự kiện sẽ chạy ở chế độ gỡ lỗi.Falsetắ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 quaasyncio.EventLoopcho 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
asynciokhô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 loop và
contextvars.Context.Nếu debug là
True, vòng lặp sự kiện sẽ chạy ở chế độ gỡ lỗi.Falsetắ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ớiasyncio.set_event_loop()nếu loop_factory làNone.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.Contexttù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ú
Runnersử 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.loop và context được nhúng được tạo khi phần thân
withnhập hoặc lệnh gọi đầu tiên củarun()hoặcget_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:
asyncio.Runner.run()cài đặt trình xử lýsignal.SIGINTtù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.Zz000zz tạo nhiệm vụ chính cho coroutine được thông qua để thực thi nó.
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ọiasyncio.Task.cancel()để tăngasyncio.CancelledErrorbê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ốitry/exceptvàtry/finallycó 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ăngKeyboardInterrupt.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ăngKeyboardInterruptmà không hủy tác vụ chính.