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

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ầ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

. run_until_complete[tương lai]

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

. call_soon[gọi lại , *args, context=None]

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_tương lai[]

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

coroutine . create_connection[protocol_factory , máy chủ=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None]

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] 

Chủ Đề