Khi Async gặp phải, thì hàm được gửi đến vòng lặp sự kiện và luồng chính có thể tiếp tục hoạt động.
Điều này là gần, nhưng không hoàn toàn đúng. Trong JavaScript, việc thực thi sẽ không dừng lại cho đến khi CallStack bị xóa - từ khóa đang chờ đợi sẽ đình chỉ việc thực hiện một chức năng cụ thể cho đến khi một sự kiện kích hoạt và trong thời gian đó, kiểm soát trở lại người gọi. Điều này có nghĩa là phần đầu tiên của bất kỳ chức năng async nào sẽ thực thi ngay khi nó được gọi [nó không được đưa ngay lập tức vào vòng lặp sự kiện] và sẽ chỉ tạm dừng ngay khi một await
bị tấn công.
Để có được hành vi này trong Python, nghĩa là - cho phép chủ đề chính tiếp tục trong khi thực hiện các tác vụ trẻ, tùy chọn duy nhất là đa luồng/đa xử lý.
Sự khác biệt ở đây là theo mặc định, JavaScript luôn có một vòng lặp sự kiện và Python thì không. Nói cách khác, Python có công tắc bật/tắt cho lập trình không đồng bộ trong khi JavaScript không. Khi bạn chạy một cái gì đó như loop.run_forever[]
, về cơ bản, bạn sẽ bật vòng lặp sự kiện và việc thực thi sẽ không tiếp tục nơi bạn rời đi cho đến khi vòng lặp sự kiện bị tắt. .
Bạn đang hỏi liệu có cách nào để mã của bạn tiếp tục thực thi sau khi bắt đầu vòng lặp sự kiện không. Tôi khá chắc chắn câu trả lời là không, cũng không cần thiết. Bất cứ điều gì bạn muốn thực hiện sau khi vòng lặp sự kiện bắt đầu chỉ có thể được thực hiện trong vòng lặp sự kiện.
Nếu bạn muốn chương trình Python của mình hoạt động giống như JavaScript, thì điều đầu tiên bạn làm có thể là bắt đầu một vòng lặp sự kiện, và sau đó bất kỳ logic nào có thể được đặt trong nhiệm vụ đầu tiên mà vòng lặp sự kiện thực hiện. Trong JavaScript, tấm nồi hơi này về cơ bản xảy ra với bạn và mã nguồn của bạn thực sự là nhiệm vụ đầu tiên được xếp hàng trong vòng lặp sự kiện.
Update:
Bởi vì dường như có một số nhầm lẫn với cách Vòng lặp sự kiện JavaScript hoạt động, tôi sẽ cố gắng giải thích nó thêm một chút.
Hãy nhớ rằng một vòng lặp sự kiện chỉ đơn giản là một hệ thống, khi một số sự kiện nhất định xảy ra, một khối mã đồng bộ có thể được xếp hàng để chạy ngay khi luồng không bận.
Vì vậy, chúng ta hãy xem vòng lặp sự kiện làm gì cho một chương trình đơn giản như thế này:
// This async function will resolve
// after the number of ms provided has passed
const wait = ms => { ... }
async function main[] {
console.log[2]
await wait[100]
console.log[4]
}
console.log[1]
main[]
console.log[3]
Khi JavaScript bắt đầu thực hiện chương trình trên, nó sẽ bắt đầu bằng một nhiệm vụ duy nhất xếp hàng trong hàng "chạy những thứ này khi bạn không bận" hàng đợi. Mục này là toàn bộ chương trình.
Vì vậy, nó sẽ bắt đầu ở đầu, xác định bất cứ điều gì cần được xác định, thực thi console.log[1]
, gọi chức năng chính, nhập vào nó và chạy console.log[2]
, gọi chờ [] Trả lại một lời hứa mà sau đó chúng tôi await
, tại thời điểm đó, chúng tôi ngay lập tức quay lại người gọi chính, Main không được chờ đợi nên việc thực thi tiếp tục console.log[3]
, cho đến khi cuối cùng chúng tôi hoàn thành ở cuối tệp. Toàn bộ đường dẫn đó [từ xác định các chức năng đến console.log[3]
] là một nhiệm vụ duy nhất, không gây gián đoạn. Ngay cả khi một nhiệm vụ khác đã được xếp hàng, JavaScript sẽ không dừng lại để xử lý nhiệm vụ đó cho đến khi hoàn thành phần logic đồng bộ này.
Sau đó, bộ đếm thời gian đếm ngược của chúng tôi sẽ kết thúc và một nhiệm vụ khác sẽ đi vào hàng đợi của chúng tôi, điều này sẽ khiến chức năng chính [] của chúng tôi tiếp tục thực hiện. Logic tương tự như trước khi áp dụng ở đây - đường dẫn thực thi của chúng tôi có thể nhập và thoát các hàm async khác và sẽ chỉ dừng lại khi nó đi đến cuối, trong trường hợp này, chức năng chính [thậm chí nhấn một từ khóa đang chờ không thực sự tạo ra dòng này Dừng logic đồng bộ, nó chỉ làm cho nó quay trở lại người gọi]. Việc thực hiện một tác vụ duy nhất không dừng lại cho đến khi CallStack bị xóa và khi việc thực thi đang tiếp tục từ chức năng Async, mục đầu tiên của CallStack bắt đầu ở chức năng Async cụ thể đó.
Async/đang chờ của Python tuân theo các quy tắc tương tự, ngoại trừ thực tế là trong Python, vòng lặp sự kiện không chạy theo mặc định.
Tôi biết Python cơ bản và tôi đang học JavaScript.
Tôi đã đọc rằng mô -đun Async Python và khóa luồng và luồng để xử lý các tác vụ Async. Và việc thực hiện thường đồng thời và không song song. Tôi đã hiểu cái đó.
Bây giờ tôi đã đọc và tìm hiểu làm thế nào cơ chế hàng đợi sự kiện và hàng đợi nhiệm vụ được sử dụng để xử lý các nhiệm vụ không đồng bộ trong JavaScript. Tôi nghĩ rằng tôi có một ý tưởng về cách nó hoạt động.
** Vậy, việc triển khai không đồng bộ của Python sẽ so sánh như thế nào so với JavaScript? **
Tôi không có kinh nghiệm lập trình cuộc sống thực.
** Làm thế nào sự khác biệt thực hiện của họ cân nhắc khi đưa ra quyết định sử dụng khuôn khổ dựa trên ngôn ngữ nào? **
Vui lòng làm sáng tỏ cho tôi!