Trả lại bộ trăn

Theo mặc định asyncio chạy trong chế độ sản xuất. Để dễ dàng phát triển, asyncio có chế độ gỡ lỗi

Có một số cách để bật chế độ gỡ lỗi không đồng bộ

  • Đặt biến môi trường

    loop.call_soon_threadsafe(callback, *args)
    
    3 thành
    loop.call_soon_threadsafe(callback, *args)
    
    4

  • Sử dụng Chế độ phát triển Python .

  • Vượt qua

    loop.call_soon_threadsafe(callback, *args)
    
    5 đến
    loop.call_soon_threadsafe(callback, *args)
    
    6

  • Đang gọi

    loop.call_soon_threadsafe(callback, *args)
    
    7

Ngoài việc bật chế độ gỡ lỗi, hãy xem xét thêm

  • đặt mức nhật ký của trình ghi không đồng bộ thành

    loop.call_soon_threadsafe(callback, *args)
    
    8, ví dụ đoạn mã sau có thể chạy khi khởi động ứng dụng.

    logging.basicConfig(level=logging.DEBUG)
    

  • định cấu hình mô-đun

    loop.call_soon_threadsafe(callback, *args)
    
    9 để hiển thị cảnh báo
    loop.call_soon_threadsafe(fut.cancel)
    
    0. Một cách để làm điều đó là sử dụng tùy chọn dòng lệnh
    loop.call_soon_threadsafe(fut.cancel)
    
    1
    loop.call_soon_threadsafe(fut.cancel)
    
    2

Khi chế độ gỡ lỗi được bật

  • asyncio kiểm tra các corout không được chờ đợi và ghi nhật ký chúng; .

  • Nhiều API không đồng bộ không an toàn theo luồng (chẳng hạn như các phương thức

    loop.call_soon_threadsafe(fut.cancel)
    
    3 và
    loop.call_soon_threadsafe(fut.cancel)
    
    4) đưa ra một ngoại lệ nếu chúng được gọi từ một luồng sai

  • Thời gian thực hiện của bộ chọn I/O được ghi lại nếu mất quá nhiều thời gian để thực hiện thao tác I/O

  • Các cuộc gọi lại mất hơn 100 mili giây được ghi lại. Thuộc tính

    loop.call_soon_threadsafe(fut.cancel)
    
    5 có thể được sử dụng để đặt thời lượng thực hiện tối thiểu tính bằng giây được coi là "chậm"

Đồng thời và đa luồng¶

Một vòng lặp sự kiện chạy trong một luồng (thường là luồng chính) và thực hiện tất cả các cuộc gọi lại và tác vụ trong luồng của nó. Khi một Tác vụ đang chạy trong vòng lặp sự kiện, không có Tác vụ nào khác có thể chạy trong cùng một chuỗi. Khi một Tác vụ thực thi một biểu thức

loop.call_soon_threadsafe(fut.cancel)
6, Tác vụ đang chạy sẽ bị treo và vòng lặp sự kiện sẽ thực thi Tác vụ tiếp theo

Để lên lịch gọi lại từ một luồng hệ điều hành khác, nên sử dụng phương pháp

loop.call_soon_threadsafe(fut.cancel)
7. Ví dụ.

loop.call_soon_threadsafe(callback, *args)

Hầu như tất cả các đối tượng không đồng bộ không phải là luồng an toàn, đây thường không phải là vấn đề trừ khi có mã hoạt động với chúng từ bên ngoài Tác vụ hoặc gọi lại. Nếu cần mã như vậy để gọi API asyncio cấp thấp, nên sử dụng phương thức

loop.call_soon_threadsafe(fut.cancel)
7, e. g

________số 8

Để lên lịch cho một đối tượng coroutine từ một luồng hệ điều hành khác, nên sử dụng hàm

loop.call_soon_threadsafe(fut.cancel)
9. Nó trả về một
loop.call_soon_threadsafe(callback, *args)
00 để truy cập kết quả

loop.call_soon_threadsafe(callback, *args)
0

Để xử lý các tín hiệu và thực thi các quy trình con, vòng lặp sự kiện phải được chạy trong luồng chính

Phương pháp

loop.call_soon_threadsafe(callback, *args)
01 có thể được sử dụng với một
loop.call_soon_threadsafe(callback, *args)
02 để thực thi mã chặn trong một chuỗi hệ điều hành khác mà không chặn chuỗi hệ điều hành mà vòng lặp sự kiện chạy trong đó

Hiện tại không có cách nào để lên lịch cho các coroutine hoặc gọi lại trực tiếp từ một quy trình khác (chẳng hạn như quy trình bắt đầu bằng

loop.call_soon_threadsafe(callback, *args)
03). Phần Phương pháp vòng lặp sự kiện liệt kê các API có thể đọc từ đường dẫn và xem bộ mô tả tệp mà không chặn vòng lặp sự kiện. Ngoài ra, các API Quy trình con của asyncio cung cấp một cách để bắt đầu một quy trình và giao tiếp với nó từ vòng lặp sự kiện. Cuối cùng, phương pháp
loop.call_soon_threadsafe(callback, *args)
01 đã nói ở trên cũng có thể được sử dụng với một
loop.call_soon_threadsafe(callback, *args)
05 để thực thi mã trong một quy trình khác.

Chạy mã chặn¶

Không nên gọi trực tiếp mã chặn (liên kết với CPU). Ví dụ: nếu một hàm thực hiện phép tính sử dụng nhiều CPU trong 1 giây, thì tất cả các tác vụ IO và Tác vụ không đồng bộ đồng thời sẽ bị trễ 1 giây

Một bộ thực thi có thể được sử dụng để chạy một tác vụ trong một luồng khác hoặc thậm chí trong một quy trình khác để tránh chặn luồng hệ điều hành bằng vòng lặp sự kiện. Xem phương pháp

loop.call_soon_threadsafe(callback, *args)
01 để biết thêm chi tiết

Ghi nhật ký¶

asyncio sử dụng mô-đun

loop.call_soon_threadsafe(callback, *args)
07 và tất cả việc ghi nhật ký được thực hiện thông qua trình ghi nhật ký
loop.call_soon_threadsafe(callback, *args)
08

Mức nhật ký mặc định là

loop.call_soon_threadsafe(callback, *args)
09, có thể dễ dàng điều chỉnh

loop.call_soon_threadsafe(callback, *args)
1

Ghi nhật ký mạng có thể chặn vòng lặp sự kiện. Bạn nên sử dụng một luồng riêng để xử lý nhật ký hoặc sử dụng IO không chặn. Ví dụ: xem Xử lý trình xử lý chặn .

Phát hiện các coroutine không bao giờ chờ đợi¶

Khi một chức năng coroutine được gọi, nhưng không được chờ đợi (e. g.

loop.call_soon_threadsafe(callback, *args)
10 thay vì
loop.call_soon_threadsafe(callback, *args)
11) hoặc coroutine không được lên lịch với
loop.call_soon_threadsafe(callback, *args)
12, asyncio sẽ phát ra một
loop.call_soon_threadsafe(callback, *args)
13

loop.call_soon_threadsafe(callback, *args)
6

đầu ra

loop.call_soon_threadsafe(callback, *args)
7

Đầu ra ở chế độ gỡ lỗi

loop.call_soon_threadsafe(callback, *args)
8

Cách khắc phục thông thường là đợi coroutine hoặc gọi hàm

loop.call_soon_threadsafe(callback, *args)
12

loop.call_soon_threadsafe(callback, *args)
0

Phát hiện các ngoại lệ không bao giờ truy xuất¶

Nếu một

loop.call_soon_threadsafe(callback, *args)
15 được gọi nhưng đối tượng Tương lai không bao giờ được chờ đợi, thì ngoại lệ sẽ không bao giờ được truyền tới mã người dùng. Trong trường hợp này, asyncio sẽ đưa ra thông báo nhật ký khi đối tượng Tương lai được thu gom rác