- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
Coroutine không phải do hệ điều hành cung cấp mà do các lập trình viên cung cấp một cách giả tạo (công nghệ chuyển ngữ cảnh chế độ người dùng)
Coroutine hay còn gọi là micro-threading là công nghệ chuyển ngữ cảnh ở chế độ người dùng. Nói tóm lại, nó thực sự triển khai các khối mã chuyển đổi giữa các lần thực thi thông qua một luồng.
Một số cách để triển khai coroutine:
Ý nghĩa của coroutine
Trong một thread, nếu gặp phải thời gian chờ IO, thread sẽ không chờ và sử dụng thời gian nhàn rỗi để làm việc khác.
Hiểu các vòng lặp vi vô hạn để phát hiện và thực thi một số mã nhất định
import asyncio # Tạo hoặc nhận vòng lặp sự kiện loop = asyncio.get_event_loop() # Đặt tác vụ vào danh sách tác vụ loop.run_until_complete(task)
Hàm coroutine: khi định nghĩa hàmtên hàm def async
Đối tượng coroutine: Thực thi hàm coroutine() để lấy đối tượng coroutine
# Đối tượng Coroutine async def func(): pass # Nội dung không được thực thi # Kết quả đối tượng Coroutine = func()
Lưu ý: Việc thực thi hàm coroutine sẽ tạo ra một đối tượng coroutine và mã bên trong hàm sẽ không được thực thi.
Mã nội bộ của hàm xử lý vòng lặp sự kiện
import asyncio # Đối tượng Coroutine async def func(): pass # Nội dung không được thực thi # Đối tượng Coroutine result = func() # Thêm sự kiện để giúp thực thi mã bên trong của hàm py3.4 #loop = asyncio.get_event_loop() # loop.run_until_complete (kết quả) # py3.7 asycio.run(kết quả)
chờ đợi + đối tượng có thể chờ đợi (đối tượng coroutine, Tương lai, Nhiệm vụ)
Chờ đợi là chờ giá trị của đối tượng nhận được kết quả trước khi tiếp tục.
Trường hợp 1:
import asyncio async def func(): print("666") # Đợi 2 giây ở đây, có tác vụ khác thực hiện tác vụ khác rồi tiếp tục thực hiện ngược res = chờ asyncio.sleep(2) print("End", res) asyncio .run(func())
Trường hợp 2:
import asyncio async def else(): print("start") đang chờ asyncio.sleep(2) print("end") return "giá trị trả về" async def func(): print("Thực thi mã nội bộ của hàm coroutine") # Khi gặp một thao tác IO, coroutine (tác vụ) hiện tại sẽ bị tạm dừng và quá trình thực thi vẫn tiếp tục sau khi thao tác IO hoàn tất. # Khi coroutine hiện tại bị treo, vòng lặp sự kiện có thể thực thi các coroutine (tác vụ) khác res = chờ người khác() print("Yêu cầu IO đã kết thúc, kết quả là: ", res) asyncio.run(func())
Trường hợp ba
import asyncio async def else(): print("start") đang chờ asyncio.sleep(2) print("end") return "giá trị trả về" async def func(): print("Thực thi mã nội bộ của hàm coroutine") # Khi gặp một thao tác IO, coroutine (tác vụ) hiện tại sẽ bị tạm dừng và quá trình thực thi vẫn tiếp tục sau khi thao tác IO hoàn tất. # Khi coroutine hiện tại bị treo, vòng lặp sự kiện có thể thực thi các coroutine (tác vụ) khác res1 = chờ đợi người khác() print("Yêu cầu IO kết thúc, kết quả là: ", res1) res2 = chờ đợi người khác() print("IO request Cuối cùng, kết quả là: ", res2) asyncio.run(func())
asyncio.create_task (đối tượng coroutine)
Tạo một đối tượng Love You Task theo cách này để có thể thêm coroutine vào vòng lặp sự kiện và chờ lên lịch thực thi. Ngoài việc sử dụngasyncio.create_task()
Ngoài các chức năng, bạn cũng có thể sử dụng cấp độ thấp hơnloop_create_task()
hoặcđảm bảo_future()
chức năng. Không nên khởi tạo các đối tượng Task một cách thủ công.Địa chỉ tham khảo:
https://www.bilibili.com/video/BV1dD4y127bD
Trong thiết lập của mình, tôi đang cố gắng có Bảng giao diện kế thừa từ Bản đồ (vì nó chủ yếu được sử dụng làm trình bao bọc xung quanh bản đồ). Hai lớp kế thừa từ Bảng - cục bộ và toàn cầu. Bản đồ toàn cầu sẽ có bản đồ có thể thay đổi, trong khi bản đồ cục bộ sẽ có bản đồ chỉ có các mục cục bộ.
Rust Nomicon có toàn bộ phần về phương sai ngoại trừ phần này về Box, phần mà tôi ít nhiều hiểu được và phương sai (đồng) của Vec trên T. Box và Vec
Tôi là một lập trình viên xuất sắc, rất giỏi!