Lớp đồng hồ bấm giờ trong python
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 Show 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 chính sách vòng lặp sự kiện tùy chỉnh đang được sử dụng), nên sử dụng chức năng này được ưa thích 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ương thức vòng lặp sự kiệnCá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. . call_at(khi , gọi lại, *args, context=None)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) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4 Bản tóm tắt theo trình tự thời gian của hoạt động cơ bản như sau
Vận chuyển được tạo là một luồng hai chiều phụ thuộc vào việc triển khai lập luận khác
Đã thay đổi trong phiên bản 3. 5. Đã thêm hỗ trợ cho SSL/TLS trong. Đã thay đổi trong phiên bản 3. 6. Tùy chọn ổ cắm import asyncio import functools import os import signal def ask_exit(signame, loop): print("got signal %s: exit" % signame) loop.stop() async def main(): loop = asyncio.get_running_loop() for signame in {'SIGINT', 'SIGTERM'}: loop.add_signal_handler( getattr(signal, signame), functools.partial(ask_exit, signame, loop)) await asyncio.sleep(3600) print("Event loop running for 1 hour, press Ctrl+C to interrupt.") print(f"pid {os.getpid()}: send SIGINT or SIGTERM to exit.") asyncio.run(main())6 được đặt theo mặc định cho tất cả các kết nối TCP. Đã thay đổi trong phiên bản 3. 7. Đã thêm tham số ssl_handshake_timeout. Đã thay đổi trong phiên bản 3. 8. Đã thêm các tham số happy_eyeballs_delay và xen kẽ. Thuật toán nhãn cầu hạnh phúc. Thành công với Máy chủ xếp chồng kép. Khi đường dẫn và giao thức IPv4 của máy chủ đang hoạt động, nhưng đường dẫn và giao thức IPv6 của máy chủ không hoạt động, ứng dụng máy khách ngăn xếp kép gặp phải độ trễ kết nối đáng kể so với máy khách chỉ có IPv4. Điều này là không mong muốn vì nó khiến máy khách ngăn xếp kép có trải nghiệm người dùng kém hơn. Tài liệu này chỉ định các yêu cầu đối với các thuật toán giúp giảm độ trễ mà người dùng có thể nhìn thấy này và cung cấp một thuật toán Để biết thêm thông tin. https. //công cụ. vietf. org/html/rfc6555 Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. Xem thêm Chức năng này là một API thay thế cấp cao. Nó trả về một cặp (, ) có thể được sử dụng trực tiếp trong mã async/await coroutine . create_datagram_endpoint(protocol_factory , local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_port=None, allow_broadcast=None, sock=None)Tạo một kết nối datagram 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 Một bộ dữ liệu của import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4 được trả về khi thành công lập luận khác
Xem và ví dụ Đã thay đổi trong phiên bản 3. 4. 4. Các thông số gia đình, proto, cờ, tái sử dụng_địa chỉ, tái sử dụng_port, allow_broadcast và sock đã được thêm vào. Đã thay đổi trong phiên bản 3. 8. 1. Tham sốReuse_address không còn được hỗ trợ vì việc sử dụng # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))15 gây ra mối lo ngại đáng kể về bảo mật cho UDP. Vượt qua rõ ràng # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))16 sẽ đưa ra một ngoại lệ. Khi nhiều quy trình có UID khác nhau gán các ổ cắm cho một địa chỉ ổ cắm UDP giống hệt nhau với # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))15, các gói đến có thể được phân phối ngẫu nhiên giữa các ổ cắm Đối với các nền tảng được hỗ trợ, có thể sử dụnguse_port để thay thế cho chức năng tương tự. Với tái sử dụng_port, thay vào đó, # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))11 được sử dụng, điều này đặc biệt ngăn các quy trình có UID khác nhau gán ổ cắm cho cùng một địa chỉ ổ cắm Đã thay đổi trong phiên bản 3. 8. Đã thêm hỗ trợ cho Windows. Đã thay đổi trong phiên bản 3. 11. Tham sốReuse_address, bị vô hiệu hóa kể từ Python 3. 9. 0, 3. 8. 1, 3. 7. 6 và 3. 6. 10, đã bị xóa hoàn toàn. coroutine . create_unix_connection(protocol_factory , đường dẫn=None, *, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)Tạo kết nối Unix Họ ổ cắm sẽ là ; Một bộ dữ liệu của import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4 được trả về khi thành công đường dẫn là tên của ổ cắm miền Unix và được yêu cầu, trừ khi tham số sock được chỉ định. Các socket, , và đường dẫn Unix trừu tượng được hỗ trợ Xem tài liệu của phương thức để biết thông tin về các đối số của phương thức này Unix Đã thay đổi trong phiên bản 3. 7. Đã thêm tham số ssl_handshake_timeout. Tham số đường dẫn bây giờ có thể là một. Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. Tạo một máy chủ TCP (loại ổ cắm) lắng nghe trên cổng của địa chỉ máy chủ Trả về một đối tượng Tranh luận
Đã thay đổi trong phiên bản 3. 5. Đã thêm hỗ trợ cho SSL/TLS trong. Đã thay đổi trong phiên bản 3. 5. 1. Tham số máy chủ có thể là một chuỗi các chuỗi. Đã thay đổi trong phiên bản 3. 6. Đã thêm tham số ssl_handshake_timeout và start_serving. Tùy chọn ổ cắm import asyncio import functools import os import signal def ask_exit(signame, loop): print("got signal %s: exit" % signame) loop.stop() async def main(): loop = asyncio.get_running_loop() for signame in {'SIGINT', 'SIGTERM'}: loop.add_signal_handler( getattr(signal, signame), functools.partial(ask_exit, signame, loop)) await asyncio.sleep(3600) print("Event loop running for 1 hour, press Ctrl+C to interrupt.") print(f"pid {os.getpid()}: send SIGINT or SIGTERM to exit.") asyncio.run(main())6 được đặt theo mặc định cho tất cả các kết nối TCP. Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. Xem thêm Hàm này là API thay thế cấp cao hơn trả về một cặp và có thể được sử dụng trong mã không đồng bộ/đang chờ coroutine . create_unix_server(protocol_factory , đường dẫn=None, *, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)Tương tự nhưng hoạt động với họ ổ cắm đường dẫn là tên của ổ cắm tên miền Unix và là bắt buộc, trừ khi cung cấp đối số sock. Các socket, , và đường dẫn Unix trừu tượng được hỗ trợ Xem tài liệu của phương thức để biết thông tin về các đối số của phương thức này Unix Đã thay đổi trong phiên bản 3. 7. Đã thêm thông số ssl_handshake_timeout và start_serving. Tham số đường dẫn bây giờ có thể là một đối tượng. Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. coroutine . connect_accepted_socket(protocol_factory , sock, *, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)Bọc một kết nối đã được chấp nhận thành một cặp giao thức/truyền tải Phương pháp này có thể được sử dụng bởi các máy chủ chấp nhận các kết nối bên ngoài asyncio nhưng sử dụng asyncio để xử lý chúng Thông 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) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4 Mới trong phiên bản 3. 5. 3 Đã thay đổi trong phiên bản 3. 7. Đã thêm tham số ssl_handshake_timeout. Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. Gửi tệp qua phương tiện giao thông. Trả về tổng số byte đã gửi Phương pháp sử dụng hiệu năng cao nếu có tệp phải là đối tượng tệp thông thường được mở ở chế độ nhị phân offset cho biết bắt đầu đọc tệp từ đâu. Nếu được chỉ định, số đếm là tổng số byte cần truyền thay vì gửi tệp cho đến khi đạt đến EOF. Vị trí tệp luôn được cập nhật, ngay cả khi phương pháp này phát sinh lỗi và có thể được sử dụng để lấy số byte thực tế đã gửi dự phòng được đặt thành srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7 khiến asyncio đọc và gửi tệp theo cách thủ công khi nền tảng không hỗ trợ lệnh gọi hệ thống gửi tệp (e. g. Ổ cắm Windows hoặc SSL trên Unix) Tăng nếu hệ thống không hỗ trợ tòa nhà tòa nhà sendfile và dự phòng là # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))45 Mới trong phiên bản 3. 7 Nâng cấp kết nối dựa trên giao thông hiện có lên TLS Tạo một phiên bản bộ mã hóa/giải mã TLS và chèn nó vào giữa phương tiện truyền tải và giao thức. Bộ mã hóa/giải mã thực hiện cả giao thức truyền tải và truyền tải theo giao thức Trả về phiên bản hai giao diện đã tạo. Sau khi chờ đợi, giao thức phải ngừng sử dụng truyền tải ban đầu và chỉ giao tiếp với đối tượng được trả về vì bộ mã hóa lưu trữ dữ liệu phía giao thức và trao đổi không thường xuyên các gói phiên TLS bổ sung với truyền tải Thông số
Mới trong phiên bản 3. 7 Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số ssl_shutdown_timeout. Bắt đầu theo dõi bộ mô tả tệp fd để biết khả năng đọc và gọi lại cuộc gọi với các đối số được chỉ định sau khi fd khả dụng để đọc . remove_reader(fd)Dừng theo dõi bộ mô tả tệp fd để biết tính sẵn sàng đọc. Trả về 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 fd trước đó được theo dõi để đọc. add_writer(fd , gọi lại, *args) Bắt đầu theo dõi bộ mô tả tệp fd để biết khả năng ghi và gọi hàm gọi lại với các đối số đã chỉ định khi fd sẵn sàng để ghi Sử dụng để gọi lại . remove_writer(fd)Dừng theo dõi bộ mô tả tệp fd để ghi tính khả dụng. Trả về 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 trước đó fd được theo dõi để ghi Xem thêm phần để biết một số hạn chế của các phương pháp này Nói chung, việc triển khai giao thức sử dụng API dựa trên vận chuyển chẳng hạn như và nhanh hơn so với việc triển khai hoạt động trực tiếp với ổ cắm. Tuy nhiên, có một số trường hợp sử dụng khi hiệu suất không quan trọng và làm việc trực tiếp với các đối tượng sẽ thuận tiện hơn coroutine . sock_recv(sock , nbyte)Nhận tới nbyte từ sock. Phiên bản không đồng bộ của Trả lại dữ liệu đã nhận dưới dạng đối tượng byte sock phải là ổ cắm non-blocking Đã thay đổi trong phiên bản 3. 7. Mặc dù phương thức này luôn được ghi lại dưới dạng phương thức coroutine, nhưng vẫn phát hành trước Python 3. 7 trả lại một. Kể từ Python 3. 7 đây là một phương pháp # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))90. coroutine . sock_recv_into(sock , buf) Nhận dữ liệu từ sock vào bộ đệm buf. Được mô phỏng theo phương pháp chặn Trả về số byte được ghi vào bộ đệm sock phải là ổ cắm non-blocking Mới trong phiên bản 3. 7 coroutine . sock_recvfrom(sock , bufsize)Nhận một datagram có kích thước tối đa từ sock. Phiên bản không đồng bộ của Trả về một bộ dữ liệu (dữ liệu đã nhận, địa chỉ từ xa) sock phải là ổ cắm non-blocking Mới trong phiên bản 3. 11 coroutine . sock_recvfrom_into(sock , buf, nbytes=0)Nhận một datagram lên đến nbyte từ sock vào buf. Phiên bản không đồng bộ của Trả về một bộ (số byte nhận được, địa chỉ từ xa) sock phải là ổ cắm non-blocking Mới trong phiên bản 3. 11 coroutine . sock_sendall(sock , dữ liệu)Gửi dữ liệu đến ổ cắm sock. Phiên bản không đồng bộ của Phương pháp này tiếp tục gửi đến ổ cắm cho đến khi tất cả dữ liệu trong dữ liệu đã được gửi hoặc xảy ra lỗ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()3 được trả lại khi thành công. Khi có lỗi, một ngoại lệ được đưa ra. Ngoài ra, không có cách nào để xác định lượng dữ liệu, nếu có, đã được xử lý thành công bởi đầu nhận của kết nối sock phải là ổ cắm non-blocking Đã thay đổi trong phiên bản 3. 7. Mặc dù phương thức này luôn được ghi lại dưới dạng phương thức coroutine, trước Python 3. 7 nó trả về một. Kể từ Python 3. 7, đây là một phương pháp # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))90. coroutine . sock_sendto(sock , dữ liệu, address) Gửi một datagram từ vớ đến địa chỉ. Phiên bản không đồng bộ của Trả về số byte đã gửi sock phải là ổ cắm non-blocking Mới trong phiên bản 3. 11 coroutine . sock_connect(sock , địa chỉ)Kết nối tất với ổ cắm từ xa tại địa chỉ Phiên bản không đồng bộ của sock phải là ổ cắm non-blocking Đã thay đổi trong phiên bản 3. 5. 2. ______63_______00 không cần giải quyết nữa. import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())01 sẽ cố gắng kiểm tra xem địa chỉ đã được giải quyết chưa bằng cách gọi. Nếu không, sẽ được sử dụng để giải quyết địa chỉ. Xem thêm Và coroutine . sock_accept(sock)Chấp nhận kết nối. Được mô phỏng theo phương pháp chặn Ổ cắm phải được liên kết với một địa chỉ và lắng nghe các kết nối. Giá trị trả về là một cặp import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())07 trong đó conn là một đối tượng ổ cắm mới có thể sử dụng để gửi và nhận dữ liệu trên kết nối và địa chỉ là địa chỉ được liên kết với ổ cắm ở đầu kia của kết nối sock phải là ổ cắm non-blocking Đã thay đổi trong phiên bản 3. 7. Mặc dù phương thức này luôn được ghi lại dưới dạng phương thức coroutine, trước Python 3. 7 nó trả về một. Kể từ Python 3. 7, đây là một phương pháp # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))90. Xem thêm Và coroutine . sock_sendfile(sock , file, offset=0, count=None, *, fallback=True)Gửi tệp bằng hiệu suất cao nếu có thể. Trả về tổng số byte đã gửi Phiên bản không đồng bộ của sock phải là một non-blocking tệp phải là đối tượng tệp thông thường mở ở chế độ nhị phân offset cho biết bắt đầu đọc tệp từ đâu. Nếu được chỉ định, số đếm là tổng số byte cần truyền thay vì gửi tệp cho đến khi đạt đến EOF. Vị trí tệp luôn được cập nhật, ngay cả khi phương pháp này phát sinh lỗi và có thể được sử dụng để lấy số byte thực tế đã gửi dự phòng, khi được đặt thành srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7, làm cho asyncio đọc và gửi tệp theo cách thủ công khi nền tảng không hỗ trợ tòa nhà tòa nhà sendfile (e. g. Ổ cắm Windows hoặc SSL trên Unix) Tăng nếu hệ thống không hỗ trợ tòa nhà tòa nhà sendfile và dự phòng là # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))45 sock phải là ổ cắm non-blocking Mới trong phiên bản 3. 7 Phiên bản không đồng bộ của coroutine . getnameinfo(sockaddr , cờ=0)Phiên bản không đồng bộ của Đã thay đổi trong phiên bản 3. 7. Cả hai phương thức getaddrinfo và getnameinfo luôn được ghi lại để trả về một coroutine, nhưng trước Python 3. 7 trên thực tế, họ đã trả lại các đối tượng. Bắt đầu với Python 3. 7 cả hai phương thức đều là coroutines. Đăng ký đầu đọc của đường ống trong vòng lặp sự kiện protocol_factory phải có thể gọi được khi trả về một triển khai ống là một Cặp trả về import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4, trong đó vận chuyển hỗ trợ giao diện và giao thức là một đối tượng được khởi tạo bởi giao thức_factory Với vòng lặp sự kiện, đường ống được đặt ở chế độ không chặn coroutine . connect_write_pipe(protocol_factory , pipe)Đăng ký ghi cuối đường ống trong vòng lặp sự kiện protocol_factory phải có thể gọi được khi trả về một triển khai đường ống là Cặp trả về import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4, trong đó giao diện và giao thức hỗ trợ vận chuyển là một đối tượng được khởi tạo bởi giao thức_factory Với vòng lặp sự kiện, đường ống được đặt ở chế độ không chặn Ghi chú không hỗ trợ các phương pháp trên trên Windows. Sử dụng thay thế cho Windows Xem thêm Các và phương pháp Đặt gọi lại làm trình xử lý cho tín hiệu signum Cuộc gọi lại sẽ được gọi theo vòng lặp, cùng với các cuộc gọi lại được xếp hàng đợi khác và các coroutine có thể chạy được của vòng lặp sự kiện đó. Không giống như các trình xử lý tín hiệu đã đăng ký bằng cách sử dụng, một cuộc gọi lại đã đăng ký với chức năng này được phép tương tác với vòng lặp sự kiện Tăng nếu số tín hiệu không hợp lệ hoặc không bắt được. Nâng cao nếu có sự cố khi thiết lập trình xử lý Sử dụng để gọi lại Giống như, chức năng này phải được gọi trong luồng chính . remove_signal_handler(sig)Xóa trình xử lý cho tín hiệu sig 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 bộ xử lý tín hiệu đã bị xóa hoặc # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))45 nếu không có bộ xử lý nào được đặt cho tín hiệu đã cho Unix Xem thêm mô-đun Sắp xếp để func được gọi trong trình thực thi được chỉ định Đối số thực thi phải là một thể hiện. Người thi hành mặc định được sử dụng nếu người thi hành 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 Ví dụ import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main()) Lưu ý rằng bộ phận bảo vệ điểm vào ( import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())43) là bắt buộc đối với tùy chọn 3 do đặc thù của , được sử dụng bởi. Nhìn thấy Phương thức này trả về một đối tượng Sử dụng để giải trí Đã thay đổi trong phiên bản 3. 5. 3. không còn định cấu hình import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())49 của bộ thực thi nhóm luồng mà nó tạo ra, thay vào đó hãy để bộ thực thi nhóm luồng () đặt mặc định. . set_default_executor(executor) Đặt người thi hành làm người thi hành mặc định được sử dụng bởi. người thi hành phải là một thể hiện của Đã thay đổi trong phiên bản 3. 11. executor phải là một thể hiện của. Cho phép tùy chỉnh cách xử lý ngoại lệ trong vòng lặp sự kiện . set_exception_handler(trình xử lý)Đặt trình xử lý làm trình xử lý ngoại lệ vòng lặp sự kiện mới Nếu trình xử lý 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ì trình xử lý ngoại lệ mặc định sẽ được đặt. Mặt khác, trình xử lý phải có thể gọi được với chữ ký khớp với import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())55, trong đó import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())56 là tham chiếu đến vòng lặp sự kiện đang hoạt động và import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())57 là đối tượng import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())58 chứa thông tin chi tiết về ngoại lệ (xem tài liệu để biết chi tiết về ngữ cảnh). get_Exception_handler() Trả về trình xử lý ngoại lệ hiện tại 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 không có trình xử lý ngoại lệ tùy chỉnh nào được đặt Mới trong phiên bản 3. 5. 2 . default_exception_handler(bối cảnh)Trình xử lý ngoại lệ mặc định Điều này được gọi khi một ngoại lệ xảy ra và không có trình xử lý ngoại lệ nào được đặt. Điều này có thể được gọi bởi trình xử lý ngoại lệ tùy chỉnh muốn trì hoãn hành vi xử lý mặc định tham số bối cảnh có cùng ý nghĩa như trong . call_exception_handler(bối cảnh)Gọi trình xử lý ngoại lệ vòng lặp sự kiện hiện tại bối cảnh là một đối tượng import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())58 chứa các khóa sau (các khóa mới có thể được giới thiệu trong các phiên bản Python trong tương lai)
Ghi chú Phương thức này không nên bị quá tải trong các vòng lặp sự kiện được phân lớp. Để xử lý ngoại lệ tùy chỉnh, hãy sử dụng phương thức Nhận chế độ gỡ lỗi () của vòng lặp sự kiện Giá trị mặc định là 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 biến môi trường được đặt thành một chuỗi không trống, nếu không thì là # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))45. set_debug(đã bật. ) Đặt chế độ gỡ lỗi của vòng lặp sự kiện Đã thay đổi trong phiên bản 3. 7. Cái mới hiện cũng có thể được sử dụng để bật chế độ gỡ lỗi. Xem thêm Các Các phương pháp được mô tả trong tiểu mục này ở mức độ thấp. Thay vào đó, trong mã async/await thông thường, hãy cân nhắc sử dụng các chức năng cấp cao và tiện lợi Ghi chú Trên Windows, vòng lặp sự kiện mặc định hỗ trợ các quy trình con, trong khi đó thì không. Xem để biết chi tiết coroutine . sub process_exec(protocol_factory , * . PIPEargs, stdin=subprocess.PIPE , stdout=quy trình con. PIPE , stderr=quy trình con. ỐNG , **kwargs)Tạo một quy trình con từ một hoặc nhiều đối số chuỗi được chỉ định bởi args args phải là một danh sách các chuỗi được đại diện bởi
Chuỗi đầu tiên chỉ định chương trình có thể thực thi được và các chuỗi còn lại chỉ định các đối số. Cùng nhau, chuỗi đối số từ ________ 63 ______ 78 của chương trình Điều này tương tự với lớp thư viện tiêu chuẩn được gọi với import asyncio import concurrent.futures def blocking_io(): # File operations (such as logging) can block the # event loop: run them in a thread pool. with open('/dev/urandom', 'rb') as f: return f.read(100) def cpu_bound(): # CPU-bound operations will block the event loop: # in general it is preferable to run them in a # process pool. return sum(i * i for i in range(10 ** 7)) async def main(): loop = asyncio.get_running_loop() ## Options: # 1. Run in the default loop's executor: result = await loop.run_in_executor( None, blocking_io) print('default thread pool', result) # 2. Run in a custom thread pool: with concurrent.futures.ThreadPoolExecutor() as pool: result = await loop.run_in_executor( pool, blocking_io) print('custom thread pool', result) # 3. Run in a custom process pool: with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor( pool, cpu_bound) print('custom process pool', result) if __name__ == '__main__': asyncio.run(main())80 và danh sách các chuỗi được truyền làm đối số đầu tiên; protocol_factory phải có thể gọi được trả về một lớp con của lớp thông số khác
See the constructor of the class for documentation on other arguments Returns a pair of import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4, where transport conforms to the base class and protocol is an object instantiated by the protocol_factorycoroutine loop. subprocess_shell(protocol_factory , cmd , * , stdin=subprocess. PIPE , stdout=subprocess. PIPE , stderr=subprocess. PIPE , **kwargs) Create a subprocess from cmd, which can be a or a string encoded to the , using the platform’s “shell” syntax This is similar to the standard library class called with srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.08 protocol_factory phải có thể gọi được trả về một lớp con của lớp See for more details about the remaining arguments Returns a pair of import asyncio import datetime def display_date(end_time, loop): print(datetime.datetime.now()) if (loop.time() + 1.0) < end_time: loop.call_later(1, display_date, end_time, loop) else: loop.stop() loop = asyncio.new_event_loop() # Schedule the first call to display_date() end_time = loop.time() + 5.0 loop.call_soon(display_date, end_time, loop) # Blocking call interrupted by loop.stop() try: loop.run_forever() finally: loop.close()4, where transport conforms to the base class and protocol is an object instantiated by the protocol_factory Ghi chú It is the application’s responsibility to ensure that all whitespace and special characters are quoted appropriately to avoid vulnerabilities. The function can be used to properly escape whitespace and special characters in strings that are going to be used to construct shell commands Callback Handlesclass asyncio. HandleA callback wrapper object returned by , cancel()Cancel the callback. If the callback has already been canceled or executed, this method has no effect cancelled()Return srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7 if the callback was cancelled Mới trong phiên bản 3. 7 class asyncio. TimerHandleA callback wrapper object returned by , and This class is a subclass of when()Trả lại thời gian gọi lại theo lịch trình dưới dạng giây The time is an absolute timestamp, using the same time reference as Mới trong phiên bản 3. 7 Server ObjectsServer objects are created by , , , and functions Do not instantiate the class directly class asyncio. ServerServer objects are asynchronous context managers. When used in an srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.26 statement, it’s guaranteed that the Server object is closed and not accepting new connections when the srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.26 statement is completed srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections. Changed in version 3. 7. Server object is an asynchronous context manager since Python 3. 7. close()Stop serving. close listening sockets and set the attribute to 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 The sockets that represent existing incoming client connections are left open The server is closed asynchronously, use the coroutine to wait until the server is closed get_loop()Return the event loop associated with the server object Mới trong phiên bản 3. 7 coroutine start_serving()Start accepting connections This method is idempotent, so it can be called when the server is already serving The start_serving keyword-only parameter to and allows creating a Server object that is not accepting connections initially. In this case # will schedule "print("Hello", flush=True)" loop.call_soon( functools.partial(print, "Hello", flush=True))46, or can be used to make the Server start accepting connections Mới trong phiên bản 3. 7 coroutine serve_forever()Start accepting connections until the coroutine is cancelled. Cancellation of srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.35 task causes the server to be closed This method can be called if the server is already accepting connections. Only one srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.35 task can exist per one Server object Ví dụ 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)) Mới trong phiên bản 3. 7 is_serving()Return srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.7 if the server is accepting new connections Mới trong phiên bản 3. 7 coroutine wait_closed()Wait until the method completes socketsList of objects the server is listening on Changed in version 3. 7. Prior to Python 3. 7 srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.40 used to return an internal list of server sockets directly. Trong 3. 7 a copy of that list is returned. Event Loop Implementationsasyncio ships with two different event loop implementations. and By default asyncio is configured to use on Unix and on Windows class asyncio. SelectorEventLoopAn event loop based on the module Uses the most efficient selector available for the given platform. It is also possible to manually configure the exact selector implementation to be used import asyncio import selectors class MyPolicy(asyncio.DefaultEventLoopPolicy): def new_event_loop(self): selector = selectors.SelectSelector() return asyncio.SelectorEventLoop(selector) asyncio.set_event_loop_policy(MyPolicy()) Unix, Windows class asyncio. ProactorEventLoopVòng lặp sự kiện dành cho Windows sử dụng “Cổng hoàn thành I/O” (IOCP) Windows Xem thêm MSDN documentation on I/O Completion Ports class asyncio. Vòng lặp sự kiện trừu tượngLớp cơ sở trừu tượng cho các vòng lặp sự kiện tuân thủ không đồng bộ Phần này liệt kê tất cả các phương pháp mà một triển khai thay thế của srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.46 nên đã xác định ví dụLưu ý rằng tất cả các ví dụ trong phần này đều có mục đích hiển thị cách sử dụng API vòng lặp sự kiện cấp thấp, chẳng hạn như và. Các ứng dụng asyncio hiện đại hiếm khi cần phải viết theo cách này; Xin chào thế giới với call_soon()Một ví dụ sử dụng phương pháp để lên lịch gọi lại. Cuộc gọi lại hiển thị srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.51 và sau đó dừng vòng lặp sự kiện 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() Xem thêm Một ví dụ tương tự được tạo bằng coroutine và hàm Hiển thị ngày hiện tại với call_later()Một ví dụ về cuộc gọi lại hiển thị ngày hiện tại mỗi giây. Cuộc gọi lại sử dụng phương thức để tự lên lịch lại sau 5 giây và sau đó dừng vòng lặp sự kiện |