Xem xét đồ thị cuộc gọi

Source code: Lib/asyncio/graph.py


asyncio có các tiện ích xem xét biểu đồ cuộc gọi trong thời gian chạy mạnh mẽ để theo dõi toàn bộ biểu đồ cuộc gọi của coroutine hoặc task đang chạy hoặc future bị treo. Các tiện ích này và máy móc cơ bản có thể được sử dụng từ bên trong chương trình Python hoặc bởi các trình biên dịch và trình gỡ lỗi bên ngoài.

Added in version 3.14.

asyncio.print_call_graph(future=None, /, *, file=None, depth=1, limit=None)

In biểu đồ lệnh gọi không đồng bộ cho tác vụ hiện tại hoặc Task hoặc Future được cung cấp.

Hàm này in các mục bắt đầu từ khung trên cùng và đi xuống điểm gọi.

Hàm nhận được đối số future tùy chọn. Nếu không được thông qua, tác vụ đang chạy hiện tại sẽ được sử dụng.

Nếu hàm được gọi trên the current task, đối số depth chỉ có từ khóa tùy chọn có thể được sử dụng để bỏ qua số lượng khung hình được chỉ định từ đầu ngăn xếp.

Nếu đối số limit chỉ có từ khóa tùy chọn được cung cấp thì mỗi ngăn xếp cuộc gọi trong biểu đồ kết quả sẽ bị cắt bớt để bao gồm tối đa các mục nhập abs(limit). Nếu limit là dương, các mục còn lại sẽ gần nhất với điểm gọi. Nếu limit âm, các mục trên cùng sẽ được giữ lại. Nếu limit bị bỏ qua hoặc None, tất cả các mục đều có mặt. Nếu limit0, ngăn xếp cuộc gọi hoàn toàn không được in, chỉ có thông tin "chờ" được in.

Nếu file bị bỏ qua hoặc None, hàm sẽ in ra sys.stdout.

Example:

Mã Python sau:

nhập asyncio

kiểm tra độ phân giải không đồng bộ():
    asyncio.print_call_graph()

async def main():
    không đồng bộ với asyncio.TaskGroup() dưới dạng g:
        g.create_task(test(), name='test')

asyncio.run(chính())

sẽ in:

* Nhiệm vụ(name='test', id=0x1039f0fe0)
+ Ngăn xếp cuộc gọi:
|   Tệp 't2.py', dòng 4, trong async test()
+ Được chờ đợi bởi:
   * Nhiệm vụ(name='Task-1', id=0x103a5e060)
      + Ngăn xếp cuộc gọi:
      |   Tệp 'taskgroups.py', dòng 107, trong không đồng bộ TaskGroup.__aexit__()
      |   Tệp 't2.py', dòng 7, trong async main()
asyncio.format_call_graph(future=None, /, *, depth=1, limit=None)

Giống như print_call_graph() nhưng trả về một chuỗi. Nếu futureNone và không có tác vụ hiện tại nào thì hàm sẽ trả về một chuỗi trống.

asyncio.capture_call_graph(future=None, /, *, depth=1, limit=None)

Ghi lại biểu đồ cuộc gọi không đồng bộ cho tác vụ hiện tại hoặc Task hoặc Future được cung cấp.

Hàm nhận được đối số future tùy chọn. Nếu không được thông qua, tác vụ đang chạy hiện tại sẽ được sử dụng. Nếu không có tác vụ hiện tại, hàm sẽ trả về None.

Nếu hàm được gọi trên the current task, đối số depth chỉ có từ khóa tùy chọn có thể được sử dụng để bỏ qua số lượng khung hình được chỉ định từ đầu ngăn xếp.

Trả về một đối tượng lớp dữ liệu FutureCallGraph:

  • FutureCallGraph(future, call_stack, awaited_by)

    Trong đó future là tham chiếu đến Future hoặc Task (hoặc các lớp con của chúng.)

    call_stack là một bộ các đối tượng FrameCallGraphEntry.

    awaited_by là một bộ các đối tượng FutureCallGraph.

  • FrameCallGraphEntry(frame)

    Trong đó frame là đối tượng khung của hàm Python thông thường trong ngăn xếp cuộc gọi.

Chức năng tiện ích cấp thấp

Để xem xét nội tâm biểu đồ cuộc gọi không đồng bộ, asyncio yêu cầu sự hợp tác từ các cấu trúc luồng điều khiển, chẳng hạn như shield() hoặc TaskGroup. Bất cứ khi nào có một đối tượng Future trung gian có API cấp thấp như Future.add_done_callback(), nên sử dụng hai hàm sau để thông báo cho asyncio về cách các đối tượng trung gian trong tương lai đó được kết nối chính xác với các tác vụ mà chúng bao bọc hoặc kiểm soát.

asyncio.future_add_to_awaited_by(future, waiter, /)

Ghi lại rằng future đang được waiter chờ đợi.

Cả futurewaiter đều phải là phiên bản của Future hoặc Task hoặc các lớp con của chúng, nếu không lệnh gọi sẽ không có hiệu lực.

Lệnh gọi tới future_add_to_awaited_by() phải được theo sau bởi lệnh gọi cuối cùng tới hàm future_discard_from_awaited_by() với cùng các đối số.

asyncio.future_discard_from_awaited_by(future, waiter, /)

Ghi lại rằng future không còn được waiter chờ đợi nữa.

Cả futurewaiter đều phải là phiên bản của Future hoặc Task hoặc các lớp con của chúng, nếu không lệnh gọi sẽ không có hiệu lực.