Vòng lặp sự kiện là cốt lõi của mọi ứng dụng asyncio. Các vòng lặp sự kiện chạy các tác vụ và lệnh gọi lại không đồng bộ, thực hiện các hoạt động IO của mạng và chạy các quy trình con
Các nhà phát triển ứng dụng thường nên sử dụng các hàm asyncio cấp cao, chẳng hạn như và hiếm khi cần tham chiếu đối tượng vòng lặp hoặc gọi các phương thức của nó. Phần này chủ yếu dành cho các tác giả của mã, thư viện và khung cấp thấp hơn, những người cần kiểm soát tốt hơn đối với hành vi của vòng lặp sự kiện
Lấy vòng lặp sự kiện
Các chức năng cấp thấp sau đây có thể được sử dụng để lấy, đặt hoặc tạo một vòng lặp sự kiện
không đồng bộ. get_running_loop[]Trả về vòng lặp sự kiện đang chạy trong chuỗi hệ điều hành hiện tại
Tăng a nếu không có vòng lặp sự kiện đang chạy
Hàm này chỉ có thể được gọi từ coroutine hoặc callback
Mới trong phiên bản 3. 7
không đồng bộ. get_event_loop[]Nhận vòng lặp sự kiện hiện tại
Khi được gọi từ coroutine hoặc callback [e. g. được lên lịch với call_soon hoặc API tương tự], chức năng này sẽ luôn trả về vòng lặp sự kiện đang chạy
Nếu không có bộ vòng lặp sự kiện đang chạy, hàm sẽ trả về kết quả của lệnh gọi
# will schedule "print["Hello", flush=True]" loop.call_soon[ functools.partial[print, "Hello", flush=True]]2
Bởi vì chức năng này có hành vi khá phức tạp [đặc biệt là khi các chính sách vòng lặp sự kiện tùy chỉnh được sử dụng], nên sử dụng chức năng này được ưu tiên hơn trong coroutine và cuộc gọi lại
Như đã lưu ý ở trên, hãy cân nhắc sử dụng chức năng cấp cao hơn, thay vì sử dụng các chức năng cấp thấp hơn này để tạo và đóng vòng lặp sự kiện theo cách thủ công
Ghi chú
Trong Python phiên bản 3. 10. 0–3. 10. 8 và 3. 11. 0 chức năng này [và các chức năng khác sử dụng nó hoàn toàn] đã phát ra nếu không có vòng lặp sự kiện nào đang chạy, ngay cả khi vòng lặp hiện tại được đặt theo chính sách. Trong Python phiên bản 3. 10. 9, 3. 11. 1 và 3. 12 chúng phát ra nếu không có vòng lặp sự kiện đang chạy và không có vòng lặp hiện tại nào được đặt. Trong một số bản phát hành Python trong tương lai, điều này sẽ trở thành một lỗi
không đồng bộ. set_event_loop[vòng lặp]Đặt vòng lặp làm vòng lặp sự kiện hiện tại cho chuỗi hệ điều hành hiện tại
không đồng bộ. new_event_loop[]Tạo và trả về một đối tượng vòng lặp sự kiện mới
Lưu ý rằng hành vi của , , và chức năng có thể được thay đổi bởi
nội dung
Trang tài liệu này chứa các phần sau
Phần này là tài liệu tham khảo về API vòng lặp sự kiện;
Phần này ghi lại các trường hợp và được trả về từ các phương pháp lập lịch trình như và ;
Các loại tài liệu phần được trả về từ các phương thức vòng lặp sự kiện như;
Phần ghi lại các và các lớp;
Phần giới thiệu cách làm việc với một số API vòng lặp sự kiện
Phương thức vòng lặp sự kiện
Các vòng lặp sự kiện có các API cấp thấp cho các mục sau
Chạy cho đến khi tương lai [một phiên bản của] hoàn thành
Nếu đối số là a thì nó được lên lịch ngầm định để chạy dưới dạng
Trả lại kết quả của Tương lai hoặc tăng ngoại lệ của nó
. run_forever[]Chạy vòng lặp sự kiện cho đến khi được gọi
Nếu được gọi trước khi được gọi, vòng lặp sẽ thăm dò bộ chọn I/O một lần với thời gian chờ bằng 0, chạy tất cả các lệnh gọi lại đã lên lịch để phản hồi các sự kiện I/O [và những cuộc gọi đã được lên lịch], sau đó thoát
Nếu được gọi trong khi đang chạy, vòng lặp sẽ chạy lô gọi lại hiện tại rồi thoát. Lưu ý rằng các cuộc gọi lại mới được lên lịch bởi các cuộc gọi lại sẽ không chạy trong trường hợp này;
. dừng lại[]Dừng vòng lặp sự kiện
. is_running[]Trả lại
srv = await loop.create_server[...] async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7 nếu vòng lặp sự kiện hiện đang chạy. được_đóng[]
Trả lại
srv = await loop.create_server[...] async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7 nếu vòng lặp sự kiện đã đóng. đóng[]
Đóng vòng lặp sự kiện
Vòng lặp không được chạy khi chức năng này được gọi. Mọi cuộc gọi lại đang chờ xử lý sẽ bị loại bỏ
Phương pháp này xóa tất cả các hàng đợi và tắt trình thực thi, nhưng không đợi trình thực thi kết thúc
Phương pháp này là idempotent và không thể đảo ngược. Không có phương thức nào khác được gọi sau khi vòng lặp sự kiện được đóng lại
coroutine . shutdown_asyncgens[]Lên lịch tất cả các đối tượng hiện đang mở để đóng bằng một cuộc gọi. Sau khi gọi phương thức này, vòng lặp sự kiện sẽ đưa ra cảnh báo nếu một trình tạo không đồng bộ mới được lặp lại. Điều này nên được sử dụng để hoàn thiện một cách đáng tin cậy tất cả các trình tạo không đồng bộ theo lịch trình
Lưu ý rằng không cần gọi chức năng này khi được sử dụng
Ví dụ
try: loop.run_forever[] finally: loop.run_until_complete[loop.shutdown_asyncgens[]] loop.close[]
Mới trong phiên bản 3. 6
coroutine . shutdown_default_executor[]Lên lịch đóng trình thực thi mặc định và đợi nó tham gia tất cả các luồng trong
async def client_connected[reader, writer]: # Communicate with the client with # reader/writer streams. For example: await reader.readline[] async def main[host, port]: srv = await asyncio.start_server[ client_connected, host, port] await srv.serve_forever[] asyncio.run[main['127.0.0.1', 0]]1. Sau khi gọi phương thức này, a sẽ được nâng lên nếu được gọi trong khi sử dụng trình thực thi mặc định
Lưu ý rằng không cần gọi chức năng này khi được sử dụng
Mới trong phiên bản 3. 9
Lên lịch gọi lại để được gọi với các đối số args ở lần lặp tiếp theo của vòng lặp sự kiện
Các cuộc gọi lại được gọi theo thứ tự mà chúng được đăng ký. Mỗi cuộc gọi lại sẽ được gọi chính xác một lần
Đối số ngữ cảnh chỉ từ khóa tùy chọn cho phép chỉ định một tùy chỉnh để gọi lại chạy trong. Ngữ cảnh hiện tại được sử dụng khi không có ngữ cảnh nào được cung cấp
Một phiên bản của được trả về, có thể được sử dụng sau này để hủy cuộc gọi lại
Phương pháp này không an toàn cho luồng
. call_soon_threadsafe[gọi lại , *args, context=None]Một biến thể thread-safe của. Phải được sử dụng để lên lịch gọi lại từ một luồng khác
Tăng nếu được gọi trên một vòng lặp đã bị đóng. Điều này có thể xảy ra trên luồng phụ khi ứng dụng chính đang tắt
Xem phần tài liệu
Đã thay đổi trong phiên bản 3. 7. Đã thêm thông số ngữ cảnh chỉ từ khóa. Xem PEP 567 để biết thêm chi tiết.
Ghi chú
Hầu hết các chức năng lập lịch trình không cho phép chuyển các đối số từ khóa. Để làm điều đó, sử dụng
# will schedule "print["Hello", flush=True]" loop.call_soon[ functools.partial[print, "Hello", flush=True]]
Sử dụng các đối tượng một phần thường thuận tiện hơn so với sử dụng lambdas, vì asyncio có thể hiển thị các đối tượng một phần tốt hơn trong thông báo lỗi và gỡ lỗi
Vòng lặp sự kiện cung cấp các cơ chế để lên lịch các chức năng gọi lại sẽ được gọi vào một thời điểm nào đó trong tương lai. Vòng lặp sự kiện sử dụng đồng hồ đơn điệu để theo dõi thời gian
. call_later[trễ , gọi lại, *args, context=None]Lên lịch gọi lại để được gọi sau số giây trì hoãn nhất định [có thể là int hoặc float]
Một phiên bản của được trả về có thể được sử dụng để hủy cuộc gọi lại
gọi lại sẽ được gọi chính xác một lần. Nếu hai cuộc gọi lại được lên lịch chính xác cùng một lúc, thứ tự mà chúng được gọi là không xác định
Các đối số vị trí tùy chọn sẽ được chuyển đến hàm gọi lại khi nó được gọi. Nếu bạn muốn gọi lại với các đối số từ khóa, hãy sử dụng
Đối số ngữ cảnh chỉ từ khóa tùy chọn cho phép chỉ định một tùy chỉnh để gọi lại chạy trong. Ngữ cảnh hiện tại được sử dụng khi không có ngữ cảnh nào được cung cấp
Đã thay đổi trong phiên bản 3. 7. Đã thêm thông số ngữ cảnh chỉ từ khóa. Xem PEP 567 để biết thêm chi tiết.
Đã thay đổi trong phiên bản 3. 8. Trong Python 3. 7 trở về trước với việc triển khai vòng lặp sự kiện mặc định, độ trễ không thể vượt quá một ngày. Điều này đã được sửa trong Python 3. 8.
Lên lịch gọi lại để được gọi tại dấu thời gian tuyệt đối đã cho khi [một số nguyên hoặc số float], sử dụng cùng tham chiếu thời gian như
Hành vi của phương pháp này giống như
Một phiên bản của được trả về có thể được sử dụng để hủy cuộc gọi lại
Đã thay đổi trong phiên bản 3. 7. Đã thêm thông số ngữ cảnh chỉ từ khóa. Xem PEP 567 để biết thêm chi tiết.
Đã thay đổi trong phiên bản 3. 8. Trong Python 3. 7 trở về trước với việc triển khai vòng lặp sự kiện mặc định, sự khác biệt giữa thời điểm và thời gian hiện tại không thể vượt quá một ngày. Điều này đã được sửa trong Python 3. 8.
. thời gian[]Trả về thời gian hiện tại, dưới dạng một giá trị, theo đồng hồ đơn điệu bên trong của vòng lặp sự kiện
Ghi chú
Đã thay đổi trong phiên bản 3. 8. Trong Python 3. 7 và thời gian chờ sớm hơn [độ trễ tương đối hoặc thời điểm tuyệt đối] không được vượt quá một ngày. Điều này đã được sửa trong Python 3. 8.
Xem thêm
Chức năng
Tạo một đối tượng được gắn vào vòng lặp sự kiện
Đây là cách ưa thích để tạo Futures trong asyncio. Điều này cho phép các vòng lặp sự kiện của bên thứ ba cung cấp các triển khai thay thế của đối tượng Tương lai [với hiệu suất hoặc công cụ tốt hơn]
Mới trong phiên bản 3. 5. 2
. create_task[coro , *, name=None, context=None]Lên lịch thực hiện coro. Trả lại một đối tượng
Các vòng lặp sự kiện của bên thứ ba có thể sử dụng lớp con riêng của chúng để có khả năng tương tác. Trong trường hợp này, loại kết quả là một lớp con của
Nếu đối số tên được cung cấp và không phải là
import asyncio def hello_world[loop]: """A callback to print 'Hello World' and stop the event loop""" print['Hello World'] loop.stop[] loop = asyncio.new_event_loop[] # Schedule a call to hello_world[] loop.call_soon[hello_world, loop] # Blocking call interrupted by loop.stop[] try: loop.run_forever[] finally: loop.close[]3, thì nó được đặt làm tên của tác vụ bằng cách sử dụng
Đối số ngữ cảnh chỉ từ khóa tùy chọn cho phép chỉ định tùy chỉnh cho coro chạy trong. Bản sao ngữ cảnh hiện tại được tạo khi không có ngữ cảnh nào được cung cấp
Đã thay đổi trong phiên bản 3. 8. Đã thêm thông số tên.
Đã thay đổi trong phiên bản 3. 11. Đã thêm tham số ngữ cảnh.
. set_task_factory[nhà máy]Đặt một nhà máy nhiệm vụ sẽ được sử dụng bởi
Nếu nhà máy là
import asyncio def hello_world[loop]: """A callback to print 'Hello World' and stop the event loop""" print['Hello World'] loop.stop[] loop = asyncio.new_event_loop[] # Schedule a call to hello_world[] loop.call_soon[hello_world, loop] # Blocking call interrupted by loop.stop[] try: loop.run_forever[] finally: loop.close[]3, nhà máy tác vụ mặc định sẽ được đặt. Mặt khác, nhà máy phải là một hàm có thể gọi được với chữ ký phù hợp với
import asyncio def hello_world[loop]: """A callback to print 'Hello World' and stop the event loop""" print['Hello World'] loop.stop[] loop = asyncio.new_event_loop[] # Schedule a call to hello_world[] loop.call_soon[hello_world, loop] # Blocking call interrupted by loop.stop[] try: loop.run_forever[] finally: loop.close[]8, trong đó vòng lặp là một tham chiếu đến vòng lặp sự kiện đang hoạt động và coro là một đối tượng coroutine. Có thể gọi được phải trả về một đối tượng tương thích. get_task_factory[]
Trả lại nhà máy nhiệm vụ hoặc
import asyncio def hello_world[loop]: """A callback to print 'Hello World' and stop the event loop""" print['Hello World'] loop.stop[] loop = asyncio.new_event_loop[] # Schedule a call to hello_world[] loop.call_soon[hello_world, loop] # Blocking call interrupted by loop.stop[] try: loop.run_forever[] finally: loop.close[]3 nếu nhà máy mặc định đang được sử dụng
Mở kết nối truyền phát trực tuyến đến một địa chỉ nhất định được chỉ định bởi máy chủ và cổng
Họ ổ cắm có thể là hoặc tùy thuộc vào Máy chủ [hoặc đối số họ, nếu được cung cấp]
Loại ổ cắm sẽ là
protocol_factory phải có thể gọi được khi trả về một triển khai
Phương pháp này sẽ cố gắng thiết lập kết nối trong nền. Khi thành công, nó sẽ trả về một cặp
import asyncio import datetime def display_date[end_time, loop]: print[datetime.datetime.now[]] if [loop.time[] + 1.0]