Cách gọi hàm async Python

Các route, trình xử lý lỗi, before request, after request, và các chức năng xé nhỏ đều có thể là chức năng coroutine nếu Flask được cài đặt với async bổ sung (pip install flask[async]). Điều này cho phép các khung nhìn được xác định bằng async def và sử dụng await

@app.route("/get-data")
async def get_data():
    data = await async_db_query(...)
    return jsonify(data)

Các chế độ xem dựa trên lớp có thể cắm cũng hỗ trợ các trình xử lý được triển khai dưới dạng coroutines. Điều này áp dụng cho phương thức trong dạng xem kế thừa từ lớp, cũng như tất cả các trình xử lý phương thức HTTP trong dạng xem kế thừa từ lớp

Sử dụng async trên Windows trên Python 3. 8

Trăn 3. 8 có lỗi liên quan đến asyncio trên Windows. Nếu bạn gặp phải điều gì đó giống như

def extension(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ...  # Extension logic
        return current_app.ensure_sync(func)(*args, **kwargs)

    return wrapper
2, vui lòng nâng cấp lên Python 3. 9

Sử dụng async với greenlet

Khi sử dụng gevent hoặc eventlet để phục vụ một ứng dụng hoặc vá thời gian chạy, greenlet>=1. 0 là bắt buộc. Khi sử dụng PyPy, PyPy>=7. 3. 7 là bắt buộc

Hiệu suất

Các chức năng không đồng bộ yêu cầu một vòng lặp sự kiện để chạy. Flask, với tư cách là một ứng dụng WSGI, sử dụng một worker để xử lý một chu kỳ yêu cầu/phản hồi. Khi một yêu cầu đến một chế độ xem không đồng bộ, Flask sẽ bắt đầu một vòng lặp sự kiện trong một luồng, chạy chức năng xem ở đó, sau đó trả về kết quả

Mỗi yêu cầu vẫn liên quan đến một nhân viên, ngay cả đối với chế độ xem không đồng bộ. Ưu điểm là bạn có thể chạy mã không đồng bộ trong một chế độ xem, chẳng hạn như để thực hiện nhiều truy vấn cơ sở dữ liệu đồng thời, yêu cầu HTTP tới API bên ngoài, v.v. Tuy nhiên, số lượng yêu cầu mà ứng dụng của bạn có thể xử lý cùng một lúc sẽ không thay đổi

Async vốn dĩ không nhanh hơn mã đồng bộ hóa. Async có lợi khi thực hiện đồng thời các tác vụ liên kết với IO, nhưng có thể sẽ không cải thiện các tác vụ liên quan đến CPU. Chế độ xem Flask truyền thống sẽ vẫn phù hợp với hầu hết các trường hợp sử dụng, nhưng hỗ trợ không đồng bộ của Flask cho phép viết và sử dụng mã vốn không thể thực hiện được trước đây

Nhiệm vụ nền

Các chức năng không đồng bộ sẽ chạy trong một vòng lặp sự kiện cho đến khi chúng hoàn thành, tại giai đoạn này, vòng lặp sự kiện sẽ dừng lại. Điều này có nghĩa là mọi tác vụ được tạo bổ sung chưa hoàn thành khi chức năng không đồng bộ hoàn thành sẽ bị hủy. Do đó, bạn không thể sinh ra các tác vụ nền, ví dụ như qua

def extension(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ...  # Extension logic
        return current_app.ensure_sync(func)(*args, **kwargs)

    return wrapper
4

Nếu bạn muốn sử dụng các tác vụ nền thì tốt nhất nên sử dụng hàng đợi tác vụ để kích hoạt tác vụ nền, thay vì tạo ra các tác vụ trong chức năng xem. Với ý nghĩ đó, bạn có thể tạo ra các tác vụ asyncio bằng cách cung cấp Flask với máy chủ ASGI và sử dụng bộ điều hợp asgiref WsgiToAsgi như được mô tả trong ASGI . Điều này hoạt động khi bộ điều hợp tạo vòng lặp sự kiện chạy liên tục.

Khi nào nên sử dụng Quart thay thế

Hỗ trợ không đồng bộ của Flask kém hiệu quả hơn so với các khung đầu tiên không đồng bộ do cách triển khai. Nếu bạn có một cơ sở mã chủ yếu không đồng bộ, bạn nên xem xét Quart. Quart là sự triển khai lại Flask dựa trên tiêu chuẩn ASGI thay vì WSGI. Điều này cho phép nó xử lý nhiều yêu cầu đồng thời, yêu cầu chạy dài và ổ cắm web mà không yêu cầu nhiều quy trình hoặc luồng công nhân

Cũng đã có thể chạy Flask với Gevent hoặc Eventlet để nhận được nhiều lợi ích của việc xử lý yêu cầu không đồng bộ. Các thư viện này vá các hàm Python cấp thấp để thực hiện điều này, trong khi đó, async/ await và ASGI sử dụng các khả năng hiện đại, tiêu chuẩn của Python. Quyết định xem bạn có nên sử dụng Flask, Quart hay thứ gì khác hay không cuối cùng phụ thuộc vào việc hiểu các nhu cầu cụ thể của dự án của bạn

Tiện ích mở rộng

Tiện ích mở rộng Flask có trước hỗ trợ không đồng bộ của Flask không mong đợi chế độ xem không đồng bộ. Nếu họ cung cấp trình trang trí để thêm chức năng vào chế độ xem, thì những chức năng đó có thể sẽ không hoạt động với chế độ xem không đồng bộ vì chúng sẽ không chờ chức năng hoặc có thể chờ được. Các chức năng khác mà chúng cung cấp cũng sẽ không được chờ đợi và có thể sẽ bị chặn nếu được gọi trong chế độ xem không đồng bộ

Các tác giả tiện ích mở rộng có thể hỗ trợ các chức năng không đồng bộ bằng cách sử dụng phương thức. Ví dụ: nếu tiện ích mở rộng cung cấp trình trang trí chức năng xem, hãy thêm

def extension(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ...  # Extension logic
        return current_app.ensure_sync(func)(*args, **kwargs)

    return wrapper
8 trước khi gọi chức năng được trang trí,

def extension(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ...  # Extension logic
        return current_app.ensure_sync(func)(*args, **kwargs)

    return wrapper

Kiểm tra nhật ký thay đổi của tiện ích mở rộng mà bạn muốn sử dụng để xem liệu họ đã triển khai hỗ trợ không đồng bộ hay chưa hoặc đưa ra yêu cầu tính năng hoặc PR cho họ

Các vòng lặp sự kiện khác

Hiện tại Flask chỉ hỗ trợ. Có thể ghi đè để thay đổi cách gói các chức năng không đồng bộ để sử dụng một thư viện khác

Bạn có thể gọi một chức năng không đồng bộ không?

Xử lý lỗi trong các chức năng không đồng bộ rất dễ dàng. Những lời hứa có. catch() để xử lý các lời hứa bị từ chối và vì các hàm async chỉ trả về một lời hứa, nên bạn chỉ cần gọi hàm và nối thêm một. phương thức catch() đến cuối.

Bạn có thể gọi một hàm async mà không cần chờ Python không?

Không thể , vì kết quả đó không tồn tại. Gọi hàm async không tạo chuỗi, nó tạo một máy trạng thái sẽ tạo chuỗi khi được thăm dò. . await đang thực sự chạy mã.

Làm cách nào bạn có thể thực hiện tác vụ không đồng bộ trong Python?

Trong Python, chúng ta có thể làm điều này bằng cách sử dụng từ khóa async trước định nghĩa hàm . Việc thực hiện coroutine này dẫn đến một đối tượng coroutine.

Python có thể chạy không đồng bộ không?

asyncio được sử dụng làm nền tảng cho nhiều khung không đồng bộ Python cung cấp mạng hiệu suất cao và máy chủ web, thư viện kết nối cơ sở dữ liệu, hàng đợi tác vụ phân tán, v.v. asyncio thường phù hợp hoàn hảo với mã mạng có cấu trúc cấp cao và ràng buộc IO.