Đang chờ trong phương thức không đồng bộ python
Các tuyến đường, trình xử lý lỗi, trước khi yêu cầu, sau khi yêu cầu và các chức năng phân tách đều có thể là các chức năng của coroutine nếu Flask được cài đặt với phần bổ sung Show @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 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 wrapper2, vui lòng nâng cấp lên Python 3. 9 Sử dụng 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ấtCá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, ví dụ: để 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ềnCá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 wrapper4 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 đó, Tiện ích mở rộngTiệ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 wrapper8 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ácHiệ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ể chờ đợi một nonVì vậy, có một quy tắc khá chắc chắn là bạn không thể sử dụng chức năng chờ trong hàm không đồng bộ . Bất cứ khi nào asyncio quyết định rằng nó có đủ tài nguyên, nó sẽ gửi tin nhắn đó.
bạn có thể chờ đợi một nonBạn có thể tự sử dụng từ khóa chờ đợi (bên ngoài chức năng không đồng bộ) ở cấp cao nhất của mô-đun . Điều này có nghĩa là các mô-đun có mô-đun con sử dụng await sẽ đợi các mô-đun con thực thi trước khi chúng tự chạy, đồng thời không chặn các mô-đun con khác tải.
Chúng ta có thể sử dụng await mà không đặt async ở đầu hàm không?await chỉ có thể được sử dụng bên trong hàm async .
Điều gì xảy ra nếu await không được sử dụng với async?Lệnh gọi phương thức không đồng bộ bắt đầu một tác vụ không đồng bộ. Tuy nhiên, vì không có toán tử Await nào được áp dụng nên chương trình tiếp tục mà không cần đợi tác vụ hoàn thành . Trong hầu hết các trường hợp, hành vi đó không được mong đợi. |